CS231n学习笔记目录(2016年Andrej Karpathy主讲课程)
- Lecture1:Introduction(介绍)
- Lecture2:Image Classification Pipeline(数据驱动的图像分类方式) (上)
- Lecture2:Image Classification Pipeline(数据驱动的图像分类方式) (下)
- Lecture3:Loss functions and Optimization(线性分类器损失函数与最优化)
- Lecture4:Backpropagation and Neural Networks(反向传播与神经网络)
- Lecture5:Training Neural Networks(神经网络训练细节) Part 1
- Lecture6:Training Neural Networks(神经网络训练细节) Part 2
- Lecture7:Convolutional Neural Networks(卷积神经网络)
Backpropagation
首先有3个向量x、y、z,定义一个函数f,使用计算图框架表示为:
则最终f的结果为-12,现在引入一个中间变量q,则表达式就变成了一个x和y的加法以及q和z的乘法:
首先考虑f对f的导数,值为1;f对z求偏导为q,值为3,意味着变量z对最终的结果有积极的影响,如果给z增加h,则结果f增加2h;f对q的偏导为z,值为-4,对结果有消极的影响;f对x的偏导数需要通过链式法则,转换为f对q的偏导数乘以q对x的偏导数,值为z*1=-4;f对y的偏导数转换为f对q的偏导数乘以q对y的偏导数,值为-4。
正向推导是指输入x、y、z计算f的过程,反向传播是指根据链式法则对局部梯度相乘,将目标梯度展开成各中间变量链式的局部梯度。
Neural Network
之前使用的线性函数格式为f=Wx,2层的神经网络格式为f=W2max(0,W1x),这里首先使用W1x线性函数,然后通过max()函数激活,然后与W2相乘,就得到了一个2层的神经网络。因此一个神经网络包括输入层输出层,在两者之间还加入了隐藏层,可以根据需求改变隐藏层的大小(比如设置成100)。
在之前的例子中,car类的线性分类器需要处理不同朝向的汽车,且不能处理不同颜色的汽车,因此分类器效果并不好,但我们可以给神经网络赋予不同的数值,比如让第一个数值处理朝向正前方的汽车,下一个用来处理朝向向左的汽车等等,而且得到的数值只有在图片满足这些详细要求的时候才会为正,否则为0,这样就得到了一个针对所有不同情况下汽车的模板,隐藏层会对不同情况下的汽车进行筛选,W2会对不同情况下的汽车模板进行汇总。
Activation Functions
在神经网络中会用到一些激活函数。在机器学习历史上,人们一开始使用的是tanh函数,到了2021年,ReLU函数开始流行,因为这个函数能够让神经网络计算快很多,也是推荐使用的一种函数。现在也有很多新的激活函数被提出,如Maxout、ELU等,可以使用不同的激活函数来优化神经网络。
Architectures
神经网络的结构如下,左边是一个2层的神经网络(单隐藏层神经网络),右边是一个3层神经网络(双隐藏层神经网络),不包括输入层,因为输入层的神经元只有输入值,没有计算权值的过程。另外,这里每个神经元都连接下一层的所有神经元,因此称这些层为全连接层。
下面展示了一个二分类任务的两层神经网络的训练过程,二维空间中共有两种颜色的点,当隐藏层中的神经元数越来越多时,图上的边界就越扭曲,神经网络能计算的函数也越复杂。
接下来往神经网络中加入正则化,表现的是对高维度W的惩罚力度,当正则化系数越大时,这个系数使得W变得非常小(因为loss要变小),最终的函数就会变得非常平滑,当降低正则化系数后,边界扭曲程度就会变高,拟合程度更高,起作用的变量数量就会更多。
Problems
- 神经网络的神经元数量是越多越好吗?在机器学习中经常会出现模型表达能力不足的问题,加入更多的神经元会让神经网络表达性能更好,但同时也需要正则化防止过拟合。要注意防止神经网络过拟合的方法不是减少神经元,而是加入合适的正则化系数。所以人们总会希望使用更大的神经网络来进行计算,但由于时间等条件的限制,实际中会使用小一点的神经网络。
- 神经网络中是越宽越好还是越深越好?并没有一个标准答案,一般来说,如果是图片处理问题的话,层数会更重要一些,但如果处理的是一个简单的数据,就没有必要使用很深的网络。
- 不同层可以使用不同的激活函数吗?大部分情况下我们都选择在整个网络中使用一种激活函数,实际操作中通常使用ReLU函数。在不同层使用不同激活函数并没有什么好处,我们一般不会这么做。
(纯学习分享,如有侵权,联系删文)