如何解决这个问题呢?如果给不同的维度同样的数值范围,error surface应该会变得容易训练。
一般来说,特征归一化会让梯度下降收敛地更快。
对于下一层网络的参数\(W^2\)来说,它的输入又是不同维的range不一样的,所以也需要进行归一化。在激活函数前或是后没有区别,如果用Sigmoid作激活函数,对\(z\)作特征归一化相对更好。
在实操中,我们只对一个batch作normalization,因为对整个数据集做归一化是不现实的。一般batch normalization用在batch比较大的时候,因为这样它才能比较好地近似整个数据集的\(\pmb{\mu}\)和\(\pmb{\sigma}\)。
在batch normalization中还会引入参数\(\pmb{\beta}\)和\(\pmb{\gamma}\),这样模型可以自己决定hidden layer的输出要不要是0。一般\(\pmb{\beta}\)的初始值是全为1的向量,而\(\pmb{\gamma}\)的初始值为零向量。
Original paper:Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift
Batch normalization是如何帮助优化的呢?
原始论文里认为也许是因为internal covariate shift,但是How Does Batch Normalization Help Optimization?一文反驳了这个观点,这篇文章指出内部协变量偏移在神经网络训练中不一定是个问题,batch normalization有效也不见得是因为解决了内部协变量偏移。同时,这篇文章用实验结果(和理论分析)支持了batch normalization能够改变error surface的形状,而且发现用一些其它能改善error surface的方法也有差不多或甚至更好的效果,所以作者认为batch normalization能有效是serendipitous(机缘巧合的)。
现在除了batch normalization还有很多归一化方法:
前面介绍过序列作为输入时候,输出有三种情况,其中一种是输出仍然是一个序列,且输出的长度是由模型决定的。
对于没有文字的语言,比如说闽南话,我们能不能让机器直接识别出对应的中文文字呢?反过来,如果输入文字输出闽南话,那就是Text-to-Speech (TTS) Synthesis,也就是在做语音合成。