深度学习基础知识-感知机+神经网络的学习

这篇具有很好参考价值的文章主要介绍了深度学习基础知识-感知机+神经网络的学习。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

参考书籍:(找不到资源可以后台私信我)
《深度学习入门:基于Python的理论与实现 (斋藤康毅)》
《Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow, 2nd Edition (Aurelien Geron [Géron, Aurélien])》


机器学习和深度学习的区别:
深度学习基础知识-感知机+神经网络的学习

神经网络的构造

Perceptron(感知机)

感知机就是一种接收多种输入信号,输出一个信号的原件。输入信号被送往神经元时,会被分别乘以固定的权重,神经元会计算传送来的信号的总和,只有当这个总和超过某个界限值时,才会输出1,此时被称为“神经元被激活”,这个界限值称为阈值。(可以把阈值挪到等式的左边,那只需要比较总和减阈值与0的关系)

感知机的实现就是TLU(Threshold Logic Unit),如下图所示。其中X和W都是向量,Z其实计算的就是加权和。再经过step函数就得到了输出。
深度学习基础知识-感知机+神经网络的学习
常用的step function有两种:
深度学习基础知识-感知机+神经网络的学习
设置不同的权重和阈值,我们可以用感知机表示与门、与非门、或门(此处不再证明)。下图中直线就可以是一个或门,很好地把(0,0)和(1,0)、(0,1)、(1,1)分开了。
深度学习基础知识-感知机+神经网络的学习
但是,单个感知机无法表示异或门,因为异或需要用曲线来分类。也就是说,单层感知机只能表示线性空间。
深度学习基础知识-感知机+神经网络的学习
使用多层感知机即可表示异或:
深度学习基础知识-感知机+神经网络的学习
如果像下图一样,每个神经元都接收前一层的每个输出,那就是全连接层(fully connected layer / dense layer)。
深度学习基础知识-感知机+神经网络的学习
输出的计算公式为:
深度学习基础知识-感知机+神经网络的学习
其中b是bias vector,每个神经元都有一个bias。Φ是激活函数,如果神经元是TLU,那么Φ就是step function。其他的激活函数还有sigmoid、ReLU、softmax等。用上sigmoid就是神经网络了

Multilayer Perceptron

深度学习基础知识-感知机+神经网络的学习
跟前面的单层perceptron的区别就是加了隐藏层。其中靠近输入层的也叫lower layers,靠近输出层的也叫upper layers。除了输出层都有bias神经元,每一层也都是全连接的。上图也是feedforward neural network(FNN)。

激活函数

神经网络的激活函数必须使用非线性函数。因为如果使用线性函数,那么加深神经网络的层数是没有意义(只是改了权重/参数)。

输出层所用的激活函数,要根据求解问题的性质决定。一般来说,回归问题可以使用恒等函数(直接输出,不作任何处理),二分类问题可以用sigmoid函数,多元分类问题可以使用softmax函数(只是训练阶段,在推理阶段,一般会省略掉sofmax)。

  • sigmoid函数:
    深度学习基础知识-感知机+神经网络的学习

  • hyperbolic tangent function:这里h就是sigmoid函数
    tanh(z) = 2h(2x) - 1

  • ReLU(Rectified Linear Unit)函数:
    深度学习基础知识-感知机+神经网络的学习
    深度学习基础知识-感知机+神经网络的学习

  • softplus函数:(比ReLU更柔和一点)
    深度学习基础知识-感知机+神经网络的学习

  • softmax函数:
    深度学习基础知识-感知机+神经网络的学习
    由于指数增长是很恐怖的,所以为了防止溢出,如下图所示修改这个函数,并且将 C’ 改成 -max(x)
    深度学习基础知识-感知机+神经网络的学习
    python实现:

def step_func(X):
    return np.array(X > 0, dtype=int)

def sigmoid_func(X):
    return 1 / (1 + np.exp(-X))
    
def relu(X):
    return np.maximum(0, X)

def softmax(X):
    c = np.max(X)
    exp_X = np.exp(X - c)
    sum_exp_X = np.sum(exp_X)
    y = exp_X / sum_exp_X
    return y

输出层的神经元数量需要根据问题决定。对于分类问题,输出层的神经元数量一般设为类别的数量。比如使用mnist训练手写数字分类器,那可以给输出层设置10个神经元,每个神经元对应一个数字。

输入数据的集合称为批(batch)。因为计算机一般会为批处理做优化,所以以batch为单位进行推理会比较快。

神经网络的学习

损失函数(loss function)

损失函数是表示神经网络性能的“恶劣程度”的指标,即当前的神经网络对监督数据在多大程度上不拟合。在神经网络的学习/训练中,寻找最优参数(权重W和偏置B)时,要寻找使损失函数的值尽可能小的参数,此时需要计算参数的导数,然后以导数为指引,逐步更新参数的值。

可以用作损失函数的有:

参考:https://zhuanlan.zhihu.com/p/532850353
深度学习基础知识-感知机+神经网络的学习
均方误差(mean squared error)/ L2 Loss
深度学习基础知识-感知机+神经网络的学习

torch.nn.MSELoss(reduction='mean')

或者自己实现:

def mean_squared_error(y, t):
    return 0.5 * np.sum((y - t) ** 2)

RMSE
深度学习基础知识-感知机+神经网络的学习
MSE比MAE收敛更快,假设的是模型的误差服从标准高斯分布(均值0标准差1)

平均绝对误差(mean absolute error)/ L1 Loss
深度学习基础知识-感知机+神经网络的学习

torch.nn.L1Loss(reduction='mean')

MAE比MSE更不容易受到异常值影响,假设的是误差服从拉普拉斯分布(μ=0 b=1)

Huber Loss
深度学习基础知识-感知机+神经网络的学习
深度学习基础知识-感知机+神经网络的学习
结合了MSE和MAE的优点,下降速度接近MSE,缺点是需要设置δ。

torch.nn.HuberLoss(reduction='mean')

交叉熵误差(cross entropy error
其中y是one-hot表示,所以只需要计算正确预测的情况。比如正确标签的索引是2,神经网络的输出是0.6,那么 E = -ln0.6
深度学习基础知识-感知机+神经网络的学习

def cross_entropy_error(y, t):
    delta = 1e-7
    # 加一个delta是为了避免log(0)的情况
    return -np.sum(t * np.log(y + delta))

如果扩展到计算一批的误差,则是
深度学习基础知识-感知机+神经网络的学习
mini-batch学习:从训练数据中选出一批数据(mini-batch),然后对每个mini-batch进行学习。只要计算随机选出的这批数据的损失函数,就可以近似得到所有训练数据的损失。

那么,mini-batch的交叉熵误差这样计算:

def cross_entropy_error_1hot_batch(y, t):
    if y.ndim == 1:
        t = t.reshape(1, t.size)
        y = y.reshape(1, y.size)
    batch_size = y.shape[0]
    delta = 1e-7
    return -np.sum(t * np.log(y + delta)) / batch_size

def cross_entropy_error(y, t):
    if y.ndim == 1:
        t = t.reshape(1, t.size)
        y = y.reshape(1, y.size)
    batch_size = y.shape[0]
    delta = 1e-7
    return -np.sum(np.log(y[np.arrange(batch_size), t] + delta)) / batch_size

数值微分(Numerical differentiation)

前面说了,在计算神经网络的参数的时候,需要计算参数的导数。计算导数时,实际计算的是近似值。如下图所示,当h足够小的时候可以认为近似值足够接近真值。
深度学习基础知识-感知机+神经网络的学习
数值微分指的就是用数值方法近似求解导数的过程。如果以x为中心,计算左右两边的差分,就是中心差分:(如果是 x+h 与 x
之间就是前向差分)
深度学习基础知识-感知机+神经网络的学习
如果是基于数学式的推导求导数就称为解析性求导(analytic differentiation)。比如y=x^2的导数y’=2x。解析性求导得到的导数是不含误差的真实导数。

偏导数是在有多个变量的情况下,对某一个变量进行求导。比如
深度学习基础知识-感知机+神经网络的学习
它的偏微分是:
深度学习基础知识-感知机+神经网络的学习
求法就是将其他变量看作常数,只对当前变量做求导。

如果把所有变量的偏导数合在一起变成向量,就称为梯度(gradient)。梯度指示的方向是各点处的函数值减小最多的方向,但并不保证梯度所指的方向就是函数的最小值。

梯度法:从某个位置沿梯度方向前进一段,再重新求梯度,再继续按新梯度方向前进,以此逐渐减小函数值。寻找最小值的梯度法称为梯度下降法(gradient descent method),反之称为梯度上升法(gradient ascent method)。

梯度法想要寻找梯度为0的点,但是梯度为0处不一定是最小值。比如函数的极小值就是局部最小值,而鞍点(saddle point,指从某个方向看是极大值,从另一个方向看是极小值的点)也不是最小值。而且,如果函数很复杂且比较扁平,那么学习可能会进入一个平坦区域(“学习高原”),此时将无法前进。
深度学习基础知识-感知机+神经网络的学习

def numerical_gradient(f, x):
    h = 1e-4 # 0.0001
    grad = np.zeros_like(x) # 生成和x形状相同的数组
    for idx in range(x.size):
        tmp_val = x[idx]
        # f(x+h)的计算
        x[idx] = tmp_val + h
        fxh1 = f(x)
        # f(x-h)的计算
        x[idx] = tmp_val - h
        fxh2 = f(x)
        # 计算导数
        grad[idx] = (fxh1 - fxh2) / (2*h)
        x[idx] = tmp_val # 还原值
    return grad

def gradient_descent(f, init_x, lr=0.01, step_num=100):
    x = init_x
    for i in range(step_num):
        grad = numerical_gradient(f, x)
        x -= lr * grad
    return x

学习率是超参数。权重和偏置可以通过训练获取,但学习率需要人工设定。

总结:神经网络的学习过程

神经网络存在合适的权重和偏置,调整它们以便拟合训练数据,这一过程称为“学习”。学习分为4个步骤:

  1. mini-batch
    从训练数据中随机选出一部分数据称为mini-batch。后续的目标是减小mini-batch的损失函数的值。
  2. 计算梯度
    求出各个权重参数的梯度。
  3. 更新参数
    将权重参数沿着梯度方向进行微小更新。
  4. 重复前三个步骤

一个epoch表示学习中所有训练数据都被使用过一次时的更新次数。比如有1w个训练数据,每个mini-batch是100个,那么就要做100次随机梯度下降,所以epoch=100。实际操作时会先将所有训练数据随机打乱,然后按指定的batch size,按顺序生成mini-batch。

下面是示意代码。没有跑,因为部分函数需要修改。文章来源地址https://www.toymoban.com/news/detail-426173.html

class TwoLayerNet:
    def __init__(self, input_size, hidden_size, output_size,
                 weight_init_std=0.01):
        self.params = {}
        # 生成服从正态分布的数据,(r, c)
        self.params['W1'] = weight_init_std * np.random.randn(input_size, hidden_size)
        self.params['b1'] = np.zeros(hidden_size)
        self.params['W2'] = weight_init_std * np.random.randn(hidden_size, output_size)
        self.params['b2'] = np.zeros(output_size)

    def sigmoid_func(self, X):
        return 1 / (1 + np.exp(-X))

    def softmax(self, X):
        c = np.max(X)
        exp_X = np.exp(X - c)
        sum_exp_X = np.sum(exp_X)
        y = exp_X / sum_exp_X
        return y

    def cross_entropy_error(self, y, t):
        if y.ndim == 1:
            t = t.reshape(1, t.size)
            y = y.reshape(1, y.size)
        batch_size = y.shape[0]
        delta = 1e-7
        return -np.sum(np.log(y[np.arrange(batch_size), t] + delta)) / batch_size

    def predict(self, x):
        W1, W2 = self.params['W1'], self.params['W2']
        b1, b2 = self.params['b1'], self.params['b2']
        a1 = np.dot(x, W1) + b1
        z1 = self.sigmoid_func(a1)
        a2 = np.dot(z1, W2) + b2
        y = self.softmax(a2)
        return y

    def loss(self, x, t):
        y = self.predict(x)
        return self.cross_entropy_error(y, t)

    def accuracy(self, x, t):
        y = self.predict(x)
        y = np.argmax(y, axis=1)
        t = np.argmax(t, axis=1)
        acc = np.sum(y == t) / float(x.shape[0])
        return acc

    def numerical_gradient(self, f, x):
        h = 1e-4  # 0.0001
        grad = np.zeros_like(x)  # 生成和x形状相同的数组
        for idx in range(x.size):
            tmp_val = x[idx]
            # f(x+h)的计算
            x[idx] = tmp_val + h
            fxh1 = f(x)
            # f(x-h)的计算
            x[idx] = tmp_val - h
            fxh2 = f(x)
            # 计算导数
            grad[idx] = (fxh1 - fxh2) / (2 * h)
            x[idx] = tmp_val  # 还原值
        return grad

    def gradient(self, x, t):
        loss_W = lambda W: self.loss(x, t)
        grads = {}
        grads['W1'] = self.numerical_gradient(loss_W, self.params['W1'])
        grads['b1'] = self.numerical_gradient(loss_W, self.params['b1'])
        grads['W2'] = self.numerical_gradient(loss_W, self.params['W2'])
        grads['b2'] = self.numerical_gradient(loss_W, self.params['b2'])
        return grads

X_train, y_train, X_test, y_test = get_data()
train_size = X_train.shape[0]
batch_size = 100
train_loss_list = []
train_acc_list = []
test_acc_list = []
iter_per_epoch = max(train_size / batch_size, 1)
# hyperparameters
iters_num = 10000
learning_rate = 0.1
network = TwoLayerNet(input_size=784, hidden_size=50, output_size=10)
for i in range(iters_num):
    # get mini-batch
    batch_mask = np.random.choice(train_size, batch_size)
    x_batch = X_train[batch_mask]
    y_batch = y_train[batch_mask]
    # calc gradient
    grad = network.numerical_gradient(x_batch, y_batch)
    for key in ('W1', 'b1', 'W2', 'b2'):
        network.params[key] -= learning_rate * grad[key]
    loss = network.loss(x_batch, y_batch)
    train_loss_list.append(loss)
    # 计算每个epoch的识别精度
    if i % iter_per_epoch == 0:
        train_acc = network.accuracy(X_train, y_train)
        test_acc = network.accuracy(X_test, y_test)
        train_acc_list.append(train_acc)
        test_acc_list.append(test_acc)

到了这里,关于深度学习基础知识-感知机+神经网络的学习的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【深度学习_TensorFlow】感知机、全连接层、神经网络

    感知机、全连接层、神经网络是什么意思? 感知机: 是最简单的神经网络结构,可以对线性可分的数据进行分类。 全连接层: 是神经网络中的一种层结构,每个神经元与上一层的所有神经元相连接,实现全连接。 神经网络: 是由大量神经元组成的网络结构,通过层与层之间

    2024年02月14日
    浏览(40)
  • CNN卷积神经网络基础知识

    1.1 卷积核大小的选择 1. 选择奇数卷积核 ①. 保护位置信息,奇数卷积核的中心点位置在中心,有利于定位任务。 ②. padding时左右对称。 2. 在感受野相同的情况下优先选择较小的卷积核以减少计算量 ①. 两个3x3卷积核的感受野与一个5x5卷积核的感受野相同 ②. 两个3x3卷积核的

    2024年02月04日
    浏览(56)
  • YOLOv5基础知识点——卷积神经网络

    一文看懂卷积神经网络-CNN(基本原理+独特价值+实际应用)- 产品经理的人工智能学习库 (easyai.tech) 人类的视觉原理如下 :从原始信号摄入开始(瞳孔摄入像素 Pixels),接着做初步处理(大脑皮层某些细胞发现边缘和方向),然后抽象(大脑判定,眼前的物体的形状,是圆形

    2024年02月05日
    浏览(52)
  • 【人工智能】实验五 采用卷积神经网络分类MNIST数据集与基础知识

    熟悉和掌握 卷积神经网络的定义,了解网络中卷积层、池化层等各层的特点,并利用卷积神经网络对MNIST数据集进行分类。 编写卷积神经网络分类软件,编程语言不限,如Python等,以MNIST数据集为数据,实现对MNIST数据集分类操作,其中MNIST数据集共10类,分别为手写0—9。

    2024年02月04日
    浏览(64)
  • 神经网络必备基础知识:卷积、池化、全连接(通道数问题、kernel与filter的概念)

    这个不难理解。我们知道图像在计算机中是由一个个的像素组成的,可以用矩阵表示。 假设一个5x5的输入图像,我们定义一个3x3的矩阵(其中的数值是随机生成的) 然后我们拿这个卷积核,在输入图像里面,选定左上角那个3x3的矩阵,用卷积核与这个矩阵对应的位置相乘,

    2024年02月05日
    浏览(59)
  • 无人驾驶 自动驾驶汽车 环境感知 精准定位 决策与规划 控制与执行 高精地图与车联网V2X 深度神经网络学习 深度强化学习 Apollo

    百度apollo课程 1-5 百度apollo课程 6-8 七月在线 无人驾驶系列知识入门到提高 当今,自动驾驶技术已经成为整个汽车产业的最新发展方向。应用自动驾驶技术可以全面提升汽车驾驶的安全性、舒适性,满足更高层次的市场需求等。自动驾驶技术得益于人工智能技术的应用及推广

    2024年04月27日
    浏览(47)
  • 预测知识 | 神经网络、机器学习、深度学习

    神经网络 神经网络(neural network)是机器学习的一个重要分支,也是深度学习的核心算法。神经网络的名字和结构,源自人类的大脑构造,即神经网络是模拟生物学中神经元信号传输而形成的一种算法。 机器学习 在开展神经网络或深度学习研究前,需要理清人工智能(AI)、

    2024年02月13日
    浏览(41)
  • 深度神经网络基础——深度学习神经网络基础 & Tensorflow在深度学习的应用

    Tensorflow入门(1)——深度学习框架Tesnsflow入门 环境配置 认识Tensorflow 深度学习框架Tesnsflow 线程+队列+IO操作 文件读取案例 神经网络的种类: 基础神经网络:单层感知器,线性神经网络,BP神经网络,Hopfield神经网络等 进阶神经网络:玻尔兹曼机,受限玻尔兹曼机,递归神经

    2024年02月16日
    浏览(47)
  • 深度学习基础——卷积神经网络(一)

    卷积是卷积神经网络中的基本操作,对于图像的特征提取有着关键的作用,本文首先介绍卷积的基本原理与作用,然后通过编写程序实现卷积操作,并展示了均值、高斯与sobel等几种经典卷积核的卷积效果,接着调用MindSpore中的卷积算子Conv2d来实现卷积操作,最后介绍了Mind

    2024年02月20日
    浏览(39)
  • 深度学习入门(一):神经网络基础

    1、定义 通过训练多层网络结构对位置数据进行分类或回归,深度学习解决特征工程问题。 2、深度学习应用 图像处理 语言识别 自然语言处理 在移动端不太好,计算量太大了,速度可能会慢 eg.医学应用、自动上色 3、例子 使用k最近邻进行判断时, 背景主导 是最大的问题,

    2024年02月15日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包