稍微记录一下看吴恩达课程后对深度学习各种概念的理解
深度学习的大致过程
在看了吴恩达的第一节课之后我对深度学习的理解是这样的:
深度学习其实就是一个寻找拟合函数的过程,让数据通过这个函数之后能输出和人看法相似的结果。
首先我们先需要选定一个/几个模型,确定需要的参数,超参数之类的
然后我们要将已有的数据划分为训练集,验证集和测试集,以往的比例是60,20,20之类的,但是由于现在已经是大数据时代了,有些数据集已经足够大了,我们不需要那么大的验证集和测试集,可以适当减少Dev和Test的占比,比如1,0.5之类的。还有一点要注意,我们很有可能训练集和验证,测试集的来源不一样,难以保证同分布,吴恩达老师建议大家要确保验证集和测试集的数据来自同一分布
之后我们要将参数初始化,注意初始化的时候参数是否能为0,是否需要进行归一化。当然训练集的输入输出也要进行预处理,但是预处理的方法目前还没有进行太多的讲解,只有一个将图像拉成一维向量
之后就是让神经网络通过训练找到合适的参数使得训练集的成本函数不断降低。整个过程主要包括前向传播和后向传播。在我看来,前向传播就是为了计算出成本函数,后向传播就是让成本函数对各个参数求导,然后通过梯度下降的方法让成本函数进一步降低。
前后向传播的迭代次数和梯度下降学习率都通过超参数来控制,最后将训练出来的各种参数保存下来,这样就完成了一个模型的简单训练。当然其中还有很多的正则化,归一化之类的操作,但是最简单的一个模型(比如逻辑回归)大致就是这些步骤了。
然后在验证集上通过运行同一网络不同超参数和不同网络之间的模型来比较模型性能,然后再跑测试集。
为什么要向量化
因为输入数据肯定是一个庞大的数据集,如果用单纯的标量那么一定需要很多的循环,但是循环的效率是很低的,所以我们需要引入向量操作,向量操作一次性可以完成整个循环的所有运算,效率提升极大。
为什么要非线性的激活函数
因为如果使用线性的激活函数那么正向传播的输出仅仅是输入的线性组合,根本没有改变,不管你使用多少隐层都和单隐层是一样的效果。
参数初始化
为什么w参数不能直接初始化为全0?
当你这一层只有一个节点的时候,你是可以将这个节点的w参数初始化为0的。但是如果你这一层不止一个节点,而且采用了全连接的话,你还将W矩阵初始化成了0矩阵,那么你这一层每个节点的w参数之间是一个线性关系,和只有一个节点效果是一样的。
为什么要用深层表示
你可以直觉上把这种神经网络的前几层当作探测简单的函数,比如边缘,之后把它们跟后几层结合在一起,那么总体上就能学习更多复杂的函数。一般你会从比较小的细节入手,比如边缘,然后再一步步到更大更复杂的区域,比如一只眼睛或是一个鼻子,再把眼睛鼻子装一块组成更复杂的部分。
超参数
比如算法中的learning rate $ a $ (学习率)、iterations(梯度下降法循环的数量)、$ L $ (隐藏层数目)、$ n^{[l]} $ (隐藏层单元数目)、choice of activation function(激活函数的选择)都需要你来设置,这些数字实际上控制了最后的参数$ W $ 和 $ b $的值,所以它们被称作超参数。后面还有很多超参数我还有没学到,总的来讲就是能影响参数的更高级参数。
超参数的取值并没有明确的规定,这目前还是一个经验性的过程,新手上路最多的还是要不断的尝试,通过不断地修改超参数对比结果来不断修正最后找到一个相对合适的。