deeplearing.ai 深度学习课程笔记
deeplearing.ai 深度学习课程笔记
一、神经网络与机器学习
- 直观理解神经网络。随着神经网络层的加深,所提取的特征(函数)不断组合,最终得到更宏观、更复杂的所需要的特征。简单的例子比如房屋价值预测。基础特征可能是房间数,面积,邮编,交通等情况。当神经网络进行学习时,可能 hidden layer 中的某个神经元,实现的等效逻辑就是根据邮编和交通情况估计了房子是在富人区还是平民区,这个特征显然更有利于直接预测房屋的价格。
- loss function (单个样本) 和 cost function (整个网络) 的选取:不同的问题不同的 loss function 和 cost function 可能影响最终的目标函数是不是为凸的,这也就最终决定了能不能保证最终的结果时最优的。比如对于二分类问题,理想的 loss function 为下式,而传统的均方根误差将导致最终的目标函数存在多个局部最优点。
- backwark propagation 反向递推,使用链式法则。下图以逻辑回归为例给出了计算过程。对于一般神经网络而言,由于其中每一个神经元的权重和使用的**函数都是已知的,因此可以使用类似的方法进行求解。
- **函数的选取。首先**函数必须是非线性的,同时每个隐藏层神经元必须添加,因为如果没有非线性部分多个线性神经元的连接最终也只能得到线性函数,与单独一个神经元的特征(函数)作用是相同的。常用的**函数有 sigmod, tanh, ReLU, Leaky ReLU。除了输出层的神经元,且实现的分类逻辑,一般**函数都不会使用 sigmod,因为 sigmod 的输出均值是正的,而 sigmod 的输出是下一个神经元的输入,因此随着层数的加深,最终的计算结果将集中在正向饱和区,从而降低网络的收敛速度。因此,通常情况下,tanh 是严格优于 sigmod。不过 tanh 也存在饱和区,因此现代神经网络通常使用 ReLU 或 Leaky ReLU 作为**函数。Leaky ReLU 负向斜率不是十分重要,通常假设为某个比较小的常数即可。
- 随机初始化。神经网络不能简单的将权重和偏差初始化为零,因为如此根据公式,每层的每个神经元其实在重复相同的操作,这将大幅降低神经网络的效率。同时由于饱和区的存在,通常应保证初始化的值尽可能的小,这通常采用乘以 0.01 之类的一个小数实现。
- 超参数。常见的超参数有学习率,层数,每层的神经元数,迭代的数目,**函数,正则化,mini-batch大小等等。
- 大脑类比。大脑中的神经元通过接受其他神经元的输出,得到自己的输出。这和神经网路很像,但大脑神经元中的参数如何学习的,必然不是通过神经网络中的反向递推实现的,仍然是个谜。
二、Improving Deep Neural Networks: Hyperparameter tuning, Regularization and Optimization
- train, develop, test set 的划分。之前由于数据量通常较小,通常的划分是 80%-20% 或者 60%-20%-20%。但随着数据量的不断增大,由于develop 的作用只是选取超参数,因此其实一定量的数据就已经足够了。因此针对大数据的划分,可能是 98%-1%-1%。同时,由于 test set 只是为了在最后给出得到的神经网络的无偏性能评估,因此如果需要评估结果,其实可以不设置 test set。
- Bias Variance trade off:high bias low variance,欠拟合,模型复杂度不够;low bias high variance,过拟合,模型复杂度过高;high bias high variance,模型在某些区域欠拟合,又在某些区域过拟合,这在高维场景更常见。不过,对于不同任务 high 和 low 的判断是相对的。比如对于某些简单问题,人的错误率是0%,因此10%就是high;而对于复杂问题,10%有时也是可以接受的。
- 正则化。解决high bias 最好的方法是增加模型复杂度(增加神经网络神经元数量),解决high variance 最好的方法是增加数据量。不过数据量是有成本的,因此正则化通常被用来解决模型复杂度过高的过拟合问题。同时由于正则化最终起到的作用就是将权重变得小一点,从而是更新更慢,所以也别成为 weight decay。