模型怎么知道哪些特征是重要的?

一个模型的输入可能很大,每个数都可以看作是一个特征,那么神经网络在训练时怎么知道哪些特征重要哪些不重要呢?

这就好比是我为了考试而复习,我怎么知道哪些知识点重要哪些不重要呢?

事实上也很简单,考试前我确实不知道哪些重要(forward),但考试后我一定是知道的(backward)。第一次考试前我啥都不知道,所以第一次考试时我就记录下考察的知识点,下来就专门针对这些知识点进行学习,第二次考试时我也记录下考察的知识点,然后针对性复习。经过多次考试后,由于每次我都会针对上次考察的知识点进行复习,那么那些常考的知识点我就可以掌握得很牢,但每次考试中都可能出现一些冷门的考点,这些考点由于之前出现得少甚至没出现过,所以我没怎么复习过,也就是总有一些题是不会做的。每次考试后我的分数都会提高一点点(常考的知识点复习次数变多,冷门知识点涉及广度更广),最终会稳定在一个成绩区间(总有些冷门考点)

神经网络也是一样,比如一个最简单的线性模型 y = k1x1 + k2x2,它的输入是一个数组,例如(x1 = -3,x2 = 5),里面有正有负,它在第一次forward也是随机初始化参数(第一次考试瞎填,即k1和k2是两个随机数),假如我们的目标是最大化y(提升考试成绩,深度神经网络一般最小化loss,原理一样),那么很明显,我应该在第一次更新权重时增加正数前面的k,而减小负数前面的k(这个例子中增加k2,减小k1)。如此一来,下一次迭代时y就会大一点点,经过不断迭代,这里的y就能不停增大。实际上深度学习模型远比这个复杂,且一般都不是线性网络,所以y不一定能无限增大(或减小)。

那么思考一个问题,假如上面的x1或x2等于0怎么办?很显然,如果x等于0,那么它前面的k是不会更新的。也可以说k的梯度为0,对于多层的深度学习模型来说,如果中间层输出为0,意味着下一层的输入为0,进而可能导致下一层模型的梯度为0,由于链式求导原则,其前面所i有的模型梯度都会为0,其前面的模型在这一轮迭代中就不会更新了。进一步的,如果每一层都输出一个很小的值(远小于0),梯度叠乘的情况下,很容易引发梯度消失,反之如果每层输出一个较大的数(大于1),则又很容易引发梯度爆炸。

所以,为了缓解梯度消失或梯度爆炸,可以在中间各层网络输出加上normalize层,让这个输出不会太大也不会太小。

前面说,深度学习模型一般不会是线性网络,这就是通过激活函数体现的,激活函数一般都是一个非线性函数(模型本质上就是一个函数),例如sigmoid函数,当x很小时它的值趋近于0,当x很大时,它的值趋近于1,其实想一想,它其实就实现了计算机语言中的if else功能,如此一想,一个深度神经网络是不是就是一颗决策树了,它不停地判断if else。

Leave a Comment