在学习自然语言处理过程中,目前使用的神经网络模型中大都有embedding层。
embedding层本质是一个降维的过程,在自然语言处理过程中,如果使用的是one-hot编码,则每个word的向量的shape是[vocab_size]。one-hot编码的缺点是:word的向量表示并不能反应两个字在语言空间中的距离。word2vec提出之后,就是将word的表示从稀疏的表示变为低维稠密空间向量的表示,每个word 的shape可能只有100维(这个是根据具体的项目,可以自己进行调节的一个超参数),但是每个维度上都有数字(而不是像one-hot编码那样,向量中除了0就是1),并且两个字的向量可以进行计算。有趣的是,两个语义相近的字,在向量空间中距离也是相近的,比如‘Wemon’与‘Queen’的距离小于‘Wemon’与‘King’的距离。
在训练的过程中,word_embedding是训练的副产品,训练的本质是通过最小化损失函数不断的优化网络中的参数,包括如卷积核中的参数,池化层的参数,全连接层的偏置值,rnn单元内的参数等等,在这个过程中也会不断的修改embedding变量,当最终模型训练到较好的结果后,模型保存的是网络中的参数。这个embedding就是我们说的词向量,可以用词向量做后面的任务,如分类。
fintune一开始主要是用在图像中,网络的训练会花费很长的时间,而且如果参数调整的时候,又要重新训练一遍。tensorflow和pytorch这些框架,会封装好一些表现比较好的模型,在使用的时候直接加载就可以了,但是针对不同任务,需要在模型后面加上一些操作。比如AlexNet做二分类问题,假设训练好的AlexNet是个十分类问题,那么可以冻结特征提取部分的参数,在分类的过程中原来的网络使用的是10个神经元的全连接,可以fintune为2个神经元的全连接,这样最后结果输出就是一个二分类了。
入门小白,理解有偏差的话,欢迎交流讨论。