前言

最近在做几个人工智能相关的项目,决定写下一些博客来记录学习内容,防止以后忘记一些基础知识,本文不会涉及到很复杂的神经网络,为的就是从数学开始,在草稿本上开始,开始学习神经网络

神经网络介绍

摘自百科上一段话:

人工神经网络(英语:artificial neural network,ANNs)简称神经网络(neural network,NNs)或类神经网络,在机器学习认知科学领域,是一种模仿生物神经网络(动物的中枢神经系统,特别是大脑)的结构和功能的数学模型计算模型,用于对函数进行估计或近似。神经网络由大量的人工神经元联结进行计算。大多数情况下人工神经网络能在外界信息的基础上改变内部结构,是一种自适应系统,通俗地讲就是具备学习功能。现代神经网络是一种非线性统计性数据建模工具,神经网络通常是通过一个基于数学统计学类型的学习方法(learning method)得以优化,所以也是数学统计学方法的一种实际应用,通过统计学的标准数学方法我们能够得到大量的可以用函数来表达的局部结构空间,另一方面在人工智能学的人工感知领域,我们通过数学统计学的应用可以来做人工感知方面的决定问题(也就是说通过统计学的方法,人工神经网络能够类似人一样具有简单的决定能力和简单的判断能力),这种方法比起正式的逻辑学推理演算更具有优势。[1]

神经元

下图演示了一个基本的神经元

TypeError: Cannot read properties of undefined (reading 'v')

上图中,圆圈b是一个神经元,一般的神经元上会有偏置(bias)b会将输出数据传递给下一层神经网络方块C表示,C也同样做着跟B一样工作的这便是神经网络的基本结构,直到神经网络的输出。

在神经元上,一般还要有个非线性功能的函数,叫做激活函数(Activation Function),常见的激活函数有:relu, tanh, sigmoid

  • x的输出为xx
  • b的输出为bob_o
  • b的偏置为bb
  • 激活函数记为ff

那么就能得到一个神经元会做如下计算并输出结果给下一层与之连接的神经元,如下公式所示:

bo=f(wx+b)b_o = f(wx + b)\\

现在一步步拆分上面的计算顺序:

bo=wxbo=bo+bbo=f(bo)b_o = wx\\ b_o = b_o+b\\ b_o = f(b_o)

现在,我们已经完成了一个神经元的计算了,其他神经元同理,也就是说,现在就已经明白神经元怎么进行一次计算的了。

深度神经网络

结构介绍

TypeError: Cannot read properties of undefined (reading 'v')

由于有的Markdown,所以神经网络看起来不是很清楚,不过没关系,总之能够看出一层一层的关系即可

  • 结构:输入层L1L_1 ,隐藏层L2,L3L_2,L_3,输出层L4L_4,输入的数据是x=(x1,x2,x3)x=(x_1,x_2,x_3)
  • LijL_{ij}:表示第ii层,第jj个神经元
  • wijkw_{ijk}:第i1i-1层的神经元jj输入到第ii层神经网络的神经元kk​​的权重
  • WiW_i:第ii层的权重矩阵
  • bijb_{ij}:神经元LijL_{ij}的偏置
  • BiB_i:第ii层神经元的偏置矩阵
  • xijkx_{ijk}:表示第i1i-1层的神经元jj输入到第ii层神经元kk的输入
  • yijy_{ij}:表示第ii层神经元jj的输出

计算第一层

下面来简单的计算一下逐步计算第一层输入层L1L_1

  1. 乘以权重

I1=(I11,I12,I13)=x×W1=(x1,x2,x3)×(w11w12w13w21w22w23w31w32w33)I_{1} = (I_{11}, I_{12}, I_{13}) \\ = x\times W_1 \\ = (x_1,x_2,x_3)\times \left( \begin{matrix} w_{11} & w_{12} & w_{13}\\ w_{21} & w_{22} & w_{23}\\ w_{31} & w_{32} & w_{33} \end{matrix} \right)

  1. 计算偏置

I1=(I11,I12,I13)=I1+B1=(I11,I12,I13)+(b11,b12,b13)I_1^{'} = (I_{11}^{'}, I_{12}^{'}, I_{13}^{'})\\ = I_1 + B_1\\ = (I_{11}, I_{12}, I_{13}) + (b_{11}, b_{12}, b_{13})

  1. 非线性操作

Y1=(Y11,Y12,Y13)=f1(I1)=(f11(I11),f12(I12),f13(I13))Y_{1} = (Y_{11}, Y_{12}, Y_{13}) \\ = f_1(I_1^{'})=(f_{11}(I_{11}^{'}), f_{12}(I_{12}^{'}), f_{13}(I_{13}^{'}))

其实大部分说来,一层或者整个神经网络结构都是一样的激活函数,可以直接记为f(I1)f(I_1^{'})就行

计算后续层

由上述计算的隐藏层L1L_1的输入继续计算第二层即可,只需要简单的把O1O_1换成xx,把其他参数换成第二层的即可,如果用矩阵表示的话:

Y1=f(xW1+B1)Y2=f(Y1W2+B2)Y3=f(Y2W3+B3)y^=Y3Wy+ByY_1 = f(xW_1+B_1)\\ Y_2 = f(Y_1W_2+B_2)\\ Y_3 = f(Y_2W_3+B_3)\\ \hat y = Y_3W_y+B_y

输出层一般是没有激活函数的,经过上述计算,就可以得到经过神经网络的预测值y^\hat y

损失函数

损失函数是评估神经网络输出值与真实参考值之间的误差的,常见的损失函数有:MSELoss, CrossEntropyLoss, L1Loss, NLLLoss等等,然后可以计算损失值

Loss=l(y^,y)L_{oss}=l(\hat{y}, y)

激活函数的作用

假设上述激活函数没有,那么式子会变成什么样的呢?

Y1=xW1+B1Y2=Y1W2+B2Y3=Y2W3+B3y^=Y3Wy+By={[(xW1+B1)W2+B2]W3+B3}Wy+By=[(xW1+B1)W2+B2]W3Wy+B3Wy+By=(xW1+B1)W2W3Wy+B2W3Wy+B3Wy+By=xW1W2W3Wy+B1W2W3Wy+B2W3Wy+B3Wy+By=xW+BY_1 = xW_1+B_1\\ Y_2 = Y_1W_2+B_2\\ Y_3 = Y_2W_3+B_3\\ \hat y = Y_3W_y+B_y = \{[(xW_1+B_1)W_2+B_2]W_3+B_3\}W_y+B_y\\ = [(xW_1+B_1)W_2+B_2]W_3W_y+B_3W_y+B_y\\ =(xW_1+B_1)W_2W_3W_y+B_2W_3W_y+B_3W_y+B_y\\ =xW_1W_2W_3W_y+B_1W_2W_3W_y+B_2W_3W_y+B_3W_y+B_y\\ =xW+B

算到最后发现,原来多层隐藏层就变成了一层隐藏层的功能

参数更新

梯度下降与反向传播

参考链接


  1. 维基百科编者. 人工神经网络[G/OL]. 维基百科, 2024(20240310)[2024-03-10]. https://zh.wikipedia.org/w/index.php?title=%E4%BA%BA%E5%B7%A5%E7%A5%9E%E7%BB%8F%E7%BD%91%E7%BB%9C&oldid=81838422. ↩︎