没有复杂的数学公式,简单读懂神经网络
这是我综合了斯坦福大学CS231n和哔哩哔哩等教学视频总结出的比较简单理解的神经网络(浅谈),比较适合刚学习的小白。本文以计算机视觉为例讲解。
一、什么是神经网络?
相信大家在各种教程都能看的上面的神经网络,这是一个最简单的网络或者说是感知机,X输入,红色的input layer是输入层,hidden layer是隐藏层,output layer是输出层。神经网络是有多个隐藏层,也就是多层感知机(MLP)。
输入层: 输入我们要进行分类或者回归的数据集。
隐藏层: 把非线性数据处理成线性可分的数据,激活函数在此计算激活。
输出层: 输出分类结果,是一个线性分类器(SVM、softmax等)
二、前向传播
① 输入层------>隐含层
如图,我们人眼一眼就能看到这是一只猫,但计算机不能,计算机是通过把这张图(800*600像素,彩色RGB三通道)看成一个多维数组。
RGB三个通道,每一个通道都是一个二维矩阵,矩阵中的值是它的像素,像素值是[0,255]的256个值,因为计算机用8个比特来存储一个像素值(一个比特就是0或者1的数),2的8次方就是256个数。每一张彩色图片就是由RGB这3个通道的二维矩阵构成的多维数组。
一张图片计算机可以看到很多个特征,如第一幅图的x1,x2,x3都是特征。
以本文第一张图为例,x1,x2,x3通过输入层,乘以不同的权重w1,w2,w3加上一个偏置项。(上图的猫的权重w有800 * 600 * 3=1440000个)
通过计算f(x,W) = Wx + b后的值,然后传到激活函数得到激活值再传到下一个神经元。
② 隐含层------>输出层
前一轮得出的激活值再通过f(x,W) = Wx + b计算(乘以不同的权重w4,w5,w6,w7加上一个偏置项),然后再计算一次后传到激活函数得到激活值,然后计算loss损失函数,对误差进行下面要说的反向传播,更新权值w,重新计算输出。
小结 ------ 前向传播:有了权重和输入计算出损失函数
三、反向传播
① 输出层------>隐含层
算出每个loss损失函数后,我们把每个神经元算出的损失(误差)加起来得到总损失(误差)。然后对自己求导得到1(任何函数对其自身求导 =1 )。我们想知道权重参数w4,w5,w6,w7对整体误差产生了多少影响,可以用整体误差分别对w4,w5,w6,w7求偏导求出(链式法则),求出后更新的权重w4’,w5’,w6’,w7’用这条公式计算比如计算w1’:w1’ = w1 - η*(总体误差对w1的导数),这里的η是学习率。
② 隐藏层------>输入层
我们想知道权重参数w1,w2,w3对整体误差产生了多少影响,可以用整体误差对w1,w2,w3求偏导求出后更新。(同理链式法则)
↑ 上面绿色的数字是前向传播的权重,下面红色的是更新后的权重。
↑ 前向传播的计算公式。
↑ 反向传播的计算公式。
小结 ------ 反向传播:求出损失函数对于每一个权重的偏导数
四、神经网络简单流程
一个黑箱子的诞生。
如图,比如我们要分类猫和狗。
① 准备带有label标签的猫和狗的数据集,输入我们搭建好的网络。
② 机器读取图片信息后进行多次传播训练。(多次传播迭代就是多次(前向传播+反向传播))
③ 拿一张新的test图片输入,模型读取后匹配猫和狗的识别概率,输出概率高的分类结果。
代码 + 注释:
(ps:推荐不错的教程①https://blog.csdn.net/laobai1015/article/details/72230058 神经网络中的反向传播----Back Propagation
②https://www.bilibili.com/video/BV1K7411W7So?p=4 精讲CS231N斯坦福计算机视觉公开课)