最优化——人工神经网络(ANN)

人工神经网络(ANN)

参考博客:https://www.cnblogs.com/mantch/p/11298290.html#:~:text=%E6%AD%A3%E5%90%91%E4%BC%A0%E6%92%AD,%28forward-propagation%29%E6%98%AF%E6%8C%87%E5%AF%B9%E7%A5%9E%E7%BB%8F%E7%BD%91%E7%BB%9C%E6%B2%BF%E7%9D%80%E4%BB%8E%E8%BE%93%E5%85%A5%E5%B1%82%E5%88%B0%E8%BE%93%E5%87%BA%E5%B1%82%E7%9A%84%E9%A1%BA%E5%BA%8F%EF%BC%8C%E4%BE%9D%E6%AC%A1%E8%AE%A1%E7%AE%97%E5%B9%B6%E5%AD%98%E5%82%A8%E6%A8%A1%E5%9E%8B%E7%9A%84%E4%B8%AD%E9%97%B4%E5%8F%98%E9%87%8F%20%28%E5%8C%85%E6%8B%AC%E8%BE%93%E5%87%BA%29%E3%80%82

概述

  • 外部刺激通过神经末梢,转换为电信号,转导到神经细胞(神经元)
  • 无数神经元构成神经中枢
  • 神经中枢综合各种信号,对外部刺激做出反应
  • 人体根据神经中枢的指令,对外部的刺激做出反应。

激活函数

功能:判断从多个神经元传递过来的信号之和是否超过阈值,不超过不做出任何反应

注意:神经网络的激活函数必须使用非线性函数

原因:如果使用线性函数,那么不管如何加深层数,总是存在与之等效的”无隐藏层神经网络“。

实例:

单位阶跃函数

输入小于等于0时,输出0;当输出大于0,输出1;

Sigmoid型函数

σ ( x ) = 1 1 + e x p ( − x ) \sigma(x)=\frac{1}{1+exp(-x)} σ(x)=1+exp(x)1

Tanh函数

t a n h ( x ) = e x p ( x ) − e x p ( − x ) e x p ( x ) + e x p ( − x ) tanh(x)=\frac{exp(x)-exp(-x)}{exp(x)+exp(-x)} tanh(x)=exp(x)+exp(x)exp(x)exp(x)

ReLU函数(常用)

R e L U ( x ) = m a x ( 0 , x ) ReLU(x)=max(0,x) ReLU(x)=max(0,x)

交叉熵损失函数

L i = − l o g ( e S y i ∑ j e s j ) L_i=-log(\frac{e^{S_{yi}}}{\sum j e^{sj}}) Li=log(jesjeSyi)

初次看到这个公式会觉得难以理解,下面我将结合具体的例子进行说明。

引例

引自知乎专栏:https://zhuanlan.zhihu.com/p/35709485

输入一个动物图像,来判别所属的动物类别,有三种可能,分别为猫、狗、猪。

我们想要通过构建人工神经网络去处理这个三分类问题,当从最后一层隐藏层向输出层前进时,这个时候我们得到了输出层的输入,我们采用softmax激活函数来获得输出层的输出。softmax激活函数本质上运用了机器学习中的逻辑回归算法。以该问题为例,x表示输出层获得输入, A 1 . A 2 . A 3 A_1.A_2.A_3 A1.A2.A3分别代表该图像是猫、狗、猪。我们希望将输入x映射到[0,1]的范围内,并保证映射之后的输入之和为1。以此来将映射之后的结果作为 A 1 , A 2 , A 3 A_1,A_2,A_3 A1,A2,A3发生的概率。以概率论的知识去理解,我们就是将隐藏层向输出层的输入转换为 p { A 1 ∣ x } , p { A 2 ∣ x } , P { A 3 ∣ x } p\{A_1|x\},p\{A_2|x\},P\{A_3|x\} p{A1x},p{A2x},P{A3x}。在求得概率之后,我们在输出独热码时将概率最大的那一位置1,对应于一种特定的动物。

有了模型之后,我们需要通过定义损失函数来判断模型在样本上的表现了,并以此来指导我们反向传播的过程来更新权重,使得其输出的准确率更高。那么我们可以定义哪些损失函数呢?

在老师给出的手写数字识别例子中,使用的是sigmoid分类器加均方误差作为损失函数的组合。但是这在训练过程中并不会经常使用,原因就在于在分类问题中,使用sigmoid/softmx得到概率,配合MSE损失函数时,采用梯度下降法进行学习时,会出现模型一开始训练时,学习速率非常慢的情况。

因此我们选取一个机器学习分类问题和信息论中一个非常重要的函数:交叉熵损失函数来作为我们损失函数。

如果你想要充分了解交叉熵损失函数,请移步博客:

https://blog.csdn.net/b1055077005/article/details/100152102

前面已经通过softmax求解出图像属于某一种动物的概率,也得到了最终的预测结果的独热编码形式。我们要做的就是让属于每一种动物的概率乘上他对应的独热编码(0或者1)并求和取负,来得到我们最终的损失函数。

但是我们要知道的是,通常一次训练样本数量绝对不会只有1个,也就是通常会输入多张图片。因此完整的交叉熵损失函数对应如下:
P i c = e z i c ∑ k = 1 M e z i k L = − 1 N ∑ i ∑ c = 1 M y i c l o g ( p i c ) P_{ic} = \frac{e^{z_{ic}}}{\sum_{k=1}^{M} e^{z_{ik}}} \\ L = -\frac{1}{N} \sum_i \sum_{c=1}^{M} y_{ic}log(p_{ic}) Pic=k=1MezikezicL=N1ic=1Myiclog(pic)
其中:M是所要区分的类别数量,即输出层的神经元数量。该问题是3个。

y i c y_ic yic代表如果样本i的识别结果属于第c个类别,则为1,否则为0

p i c p_{ic} pic代表样本i属于第c个类别的概率。

如果还是不太理解,我们继续结合具体的例子。

在这里插入图片描述

以该问题为例,它的损失函数计算过程如下:

在这里插入图片描述

以上就是输出层到损失函数的完整过程。可以通过一张图片来概括:

在这里插入图片描述

注意:这张图片在理解上存在些许问题,再求解完概率之后,就已经获得了独热编码,并且损失函数值的计算也需要用的独热编码,而不是通过损失函数模块获取独热编码,因此我认为将独热编码放于损失函数模块之前更为合适一些。

人工神经网络

  • 输入层:网络输入层的每个神经元代表了一个特征

  • 输出层:输出层个数代表分类标签的个数(在做二分类的时候,如果采用sigmoid分类器,输出层的神经元为1个;如果采用softmax分类器,输出层神经元个数为2个)

神经网络主要用于解决监督学习中的分类问题,主要通过带标记的数据集训练神经网络,不断调节权重,使得误差最小后。利用训练好的权重对数据进行分类。

手写数字二分类问题
  1. 将手写数字划分为12个像素块,代表了输入的特征数量,即输入层神经元数量为12。初始化随机生成权重矩阵和偏置。包括输入层到隐藏层,隐藏层到输出层。设置学习率。
  2. 开始前向传播过程,通过权重矩阵与输入层矩阵相乘,可以得到隐藏层的输入,经过sigmoid激活函数的计算,得到输入的激活函数值,并输出。通过隐藏层到输出层的权重矩阵相乘,可以得到输出层的输入,通过sigmoid激活函数计算,得到输出。
  3. 根据输出的结果代入损失函数,得到损失函数值。(由于反向传播过程需要确定47个权重和偏置的更新值,因此要求参与学习的数据至少有47张图像。)我们通过损失值对权重的偏导来指导权重下降,下降的步长为 − α ( ∂ C T ∂ w 11 2 , … , ∂ C T ∂ w 11 3 , … , ∂ C T ∂ b 1 2 , …   . ∂ C T ∂ b 1 3 , …   ) -\alpha(\frac{\partial C_T}{\partial w_{11}^2},\dots,\frac{\partial C_T}{\partial w_{11}^3},\dots,\frac{\partial C_T}{\partial b_1^2},\dots.\frac{\partial C_T}{\partial b_1^3},\dots) α(w112CT,,w113CT,,b12CT,.b13CT,),但由于直接对权重求偏导求解困难。通过链式法则先对需要求解的权重矩阵后一层的输入求偏导,再由后一层的输入对权重求偏导来求得。由于sigmoid激活函数导数的特殊性质: f ( x ) ′ = f ( x ) ( 1 − f ( x ) ) f(x)' = f(x)(1-f(x)) f(x)=f(x)(1f(x)),损失函数对于权重后一层的输入偏导可以通过先对后一层输出求偏导再由输出对输入求偏导相乘获得。
  4. 根据 δ \delta δ计算出损失函数对于权重和偏置的偏导
  5. 如果损失函数充分小,则迭代结束。
  6. 否则利用梯度下降法更新权重和偏置,转2。

softmax和交叉熵损失函数组合反向推导过程参考: ∂ C ∂ z i = a i − y i \frac{\partial C}{\partial z_i} = a_i-y_i ziC=aiyi

https://blog.csdn.net/abc13526222160/article/details/84968161

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值