目录
[2、 word2vec模型](#2、 word2vec模型)
摘要
本周学习了对GAN进行了初步的学习,通过具体案例理解了GAN的基础概念并着重从散度出发分析了GAN的理论,最后还了解了GAN的一些训练小技巧;除了上述理论部分,本周还进行了word2vec的gensim代码实践,通过word2vec模型和fasttext模型来分别完成cbow任务和skip-gram任务,最后对比二者的相似度预测结果来得出初步结论。
Abstract
This week, we have studied the preliminary study of GAN, understood the basic concepts of GAN through specific cases and analyzed the theory of GAN by focusing on dispersion, and finally understood some training tips of GAN; in addition to the theoretical part mentioned above, we have also practiced the gensim code of word2vec this week, and we have used the word2vec model and the fasttext model to word2vec model and fasttext model to complete the cbow task and skip-gram task respectively, and finally compare the similarity prediction results of the two to draw preliminary conclusions.
一、生成式对抗网络(上)
**生成式对抗网络GAN(Generative Adverserial Network):**它包含一个生成模型和一个判别模型。其中,生成模型负责捕捉样本数据的分布,而判别模型一般情况下是一个二分类器,判别输入是真实数据还是生成的样本。生成对抗网络已经从最初的图片生成,被拓展到计算机视觉的各个领域,如图像分割、视频预测、风格迁移等。
1、引入------generator
前几周,学习了一些network的架构,比如CNN、RNN、transformer等,可以处理输入是图片、序列等情况,输出可以是一个类别(分类)、或一个数值(回归预测) 。接下来学习的GAN的网络架构,该架构的network输入会增加一个simple distribution,如下图所示generator network:
上图中的z每次都不一样,是随机的。 随着z的不同,输出也会不同,y就不单单是一个类别或是一个数值,而是一个complex distribution。
GAN为什么输出是一个分布?
上图迷宫游戏中,当小精灵遇到相同的转角,有可能向右转,也有可能向左转,所以输入的资料中有不同的操作方式。
**问题:**如果说输出是一个固定值的话,就无法结合各种不同的操作方式得到正确的输出。
解决: 输入是增加一个简单分布,输出一个较复杂的分布,就能动态的把握输出值。也就是能做到输入相同值而输出不同值。
**应用场景:**绘画、聊天机器人等
案例:生成动画人物的脸
在这里,输入的简单分布选择了"正态分布",最终经过 generator输出一个更加复杂的分布。
2、discriminator
输入一张机器生成或真实的图片,输出一个数值scalar,scalar值越大代表图片越真实,scalar值越小代表图片越假。
**思路:**GAN的过程实际上就是"物竞天择,不断进化"的理论。generator产生出来的图片放入discriminator中进行判别。若是判别为真,那么discriminator就会学习更多真实图片中的特征来增强自己的判别能力;若是判别为假,那么generator就会加强对真实图片特征的学习来增强自己的生成能力。
3、GAN算法
step1 固定generator,不断更新discriminator
可以当作"分类"或是"回归"的问题,假设真实图片是类别A、机器生成图片是类别B,利用discriminator来判断输入图片是哪个类别。因为生成器是固定的,所以需要不断地提高判别器的严格程度。
step2固定discriminator,不断更新generator
一组向量作为generator的输入,generator的输出是一张图片并且作为discriminator的输入,最终输出一个得分scalar。最终输出值scalar越大越好。所以为了使得scalar变大,就应该不断调整generator的参数。也就是说,判别器的严格程度相同,需要不断提高生成器的准确率。
上图可以看出,整个network中,hidden layer就是一张张的图片,我们需要不断地调整generator和discriminator来使得最终的输出值更大。
4、GAN的理论
**散度divergence:**在机器学习中,我们常常需要用一个分布Q去逼近一个目标分布P,我们希望能够找到一个目标函数D ( Q , P ) D( Q,P)D(Q,P),计算Q到P的距离。而这一个目标函数,正是Divergence(散度),比如常见的KL-Divergence,JS-Divergence等等。
上图可以看出,代表输出的complex distribution,代表真正图片形成的distribution,函数用来表示机器生成图片与真实图片的差距大小。我们希望找到一个generator使得二者的差距最小,也就是找到函数的最小值。
KL散度: 又称为相对熵,是两个概率分布间差异的非对称性度量
问题: 我们不知道和的分布是什么,并且散度函数的计算比较复杂
**解决:**不需要知道以上两个的具体分布函数,只需要进行采样即可,如下图:
从database中采样一部分真实图片,从一组向量中采样出一部分机器生成的图片。最终计算出上式最小值。
问题: 如何选择合适的和 作为函数的取值
解决: 函数的本质就是分辨真实图片和虚假图片,所以要求取得的散度最大。此时就需要用到discriminator ,真实图片(从中sample出来)的scalar值大、机器生成图片(从中sample出来)的scalar值小。
实际上,我们把函数转化成了对函数求最大值,又可以表示成交叉熵的计算形式(此时式子中的未知数只有discriminator的输出值)。有些类似于二分类的任务。
如果说,训练得到的最大值较小,说明真实图片和虚假图片差别较小,效果不好;若是最大值较大,说明真实图片和虚假图片差别较大,效果较好。
5、GAN的训练技巧
**JS divergence:**定义于两个概率分布上,根据KL散度构造,同样描述了两个概率分布的差异,且具有对称性。
(1)JS divergence是不合适的
和 重合度很小:本身分布的重合度小;本身分布有重合,但是sample的点不重合
问题: 如果和 无重合,那么JS divergence计算结果总是为log2
如果前两种未重合的情况得出的JS值都是log2,那么就表示不出来JS值真正哪个最大。这样的话就会导致,未重合均为log2,重合均为0,最终的分类训练得出的正确率是100%(无法实时检测训练效果的好坏)。
**解决:**wasserstein distance
(2)wasserstein distance
上图中,我们想要将P的土堆推成Q土堆的形状,此时有很多种方法,最短的一种方法d叫做wasserstein distance。
我们将距离的计算由JS divergence换为wasserstein distance,就可以解决上述'"equally bad"的问题,就能够使得两个分布不断地接近。
(3)WGAN
当我们将GAN中的JS divergence用wasserstein distance来取代时,就叫做WGAN
**问题:**Wasserstein distance这个距离应该怎么距离计算呢
解决:
二、word2vec------gensim实践
**问题:**词向量的缺点------占用空间大,并且词与词之间没有任何语义关联
**解决:**Distributional representations
分布式表示Distributional representations: 将单词从原先所属的空间(一般是one-hot编码)映射到新的低维空间 中去,同时,低维空间的词向量还能表达出一些语义。word2vec的方法就是一种非常方便得到高质量词向量的方式。
word2vec是一种通过无监督的学习文本来产生词向量的方式,能够根据一个词的上下文很好的表达出词的含义。
周报(十二)CSDN中的案例word embedding中含有N-gram模型
1、引入
简单学习word2vec需要设定的参数以及所用到的函数。
python
from gensim.models import Word2Vec
test_sentence = """When forty winters shall besiege thy brow,
And dig deep trenches in thy beauty's field,
Thy youth's proud livery so gazed on now,
Will be a totter'd weed of small worth held:
Then being asked, where all thy beauty lies,
Where all the treasure of thy lusty days;
To say, within thine own deep sunken eyes,
Were an all-eating shame, and thriftless praise.
How much more praise deserv'd thy beauty's use,
If thou couldst answer 'This fair child of mine
Shall sum my count, and make my old excuse,'
Proving his beauty by succession thine!
This were to be new made when thou art old,
And see thy blood warm when thou feel'st it cold.""".lower().split()
model=Word2Vec([test_sentence],window=5,min_count=0,vector_size=20)
#构建Word2Vec模型
#test_sentence是按照空格划分的测试数据,window=周边词+1,
#min_count是最小值(若是单词频数小于该值,将不计入训练中),vector_size是最终提取的单词维度
常用的函数
(1)获取指定单词向量:
python
model.wv.get_vector('when')
对应前面设定的模型参数vector_size=20,每个单词的维度都是20
(2)找到前topn个(与指定单词相似性最高)的单词
python
model.wv.similar_by_word('beauty',topn=5)
模型依次计算了"beauty"与其他单词的相似度,输出前几个相似度最高的单词。
在后续介绍两种处理词嵌入的模型,word2vec模型和fasttext模型,其中word2vec模型是不含有ngram的信息,而fasttext模型是含有ngram的信息。下面会分开介绍二者对于两种任务的处理,并做出对比。
2、 word2vec模型
step1 导入必要的库包
python
from gensim.models import fasttext
from gensim.models import word2vec
import pandas as pd
import logging
import jieba
step2 数据载入与预处理
python
data = pd.read_csv("data_train.csv",sep="\t",encoding='utf8')#header=None
# print('data=',data)
# sentance = list(data)
## 对句子进行分词分词
def segment_sen(sen):
sen_list = []
try:
sen_list = jieba.lcut(sen)
except:
pass
return sen_list
# 将数据变成gensim中 word2wec函数的数据格式
sens_list = [segment_sen(i) for i in data]
print(sens_list)
jieba库中的lcut方法可以直接对文本进行分词,最后结果是一个词语列表sens_list,如下图:
step3 word2vec模型训练
python
logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)
model1 = word2vec.Word2Vec(sens_list,min_count=1,sg=0)
model2 = word2vec.Word2Vec(sens_list,min_count=1,sg=1)
try:
encoded_string = word2vec.model.encode('utf-8')
except AttributeError:
encoded_string = None # 或者其他适当的处理
model1.save("word2vec_cbow.model")#周围预测中心
model2.save("word2vec_skip.model")#中心预测周围
logging.basicConfig是用于配置日志记录器(logger)的基本选项;
word2vec.Word2Vec模型参数:size是词向量的维度、window是目标词与上下文产生关系的距离、sg代表是哪个模型------0是CBOW模型,1是skip-gram模型
step4 结果预测
任务1 cbow:已知中心词,预测周围词
python
model1.wv.most_similar('飞机','飞行')
任务2 skip-gram:已知周围词,预测中心词
python
model2.wv.most_similar('飞机')
3、fasttext模型
step1-step3 与word2vec模型相同
step4 结果预测
任务1:cbow模型
python
model3.wv.most_similar('记者','飞行')
任务2:skip-gram模型
python
model4.wv.most_similar('飞机')
两个模型对比
在cbow任务进行后输出如下:输入的周围词是"飞机"、"飞行"
结论1:可以看出,右边的相似度总体要高于左边模型,得出fasttext模型对于小段文本更优。同理对比skip-gram任务也是fasttext更优。
python
model.wv.most_similar('人工智能')
结论2:若是碰到未登录词(文本中没有包含的),word2vec模型将会报错,但是fasttext模型将会根据所学的预测输出相似的单词。对比得出,fasttext模型针对未登录词更优。
有文章https://rare-technologies.com/fasttext-and-gensim-word-embeddings/表明,fasttext模型较优的原因是因为其含有ngram的信息,一旦不含有ngram那么其预测的准确度会大大下降。如下图所示:
总结
本周学习了GAN的基础概念以及其算法和理论推导,并且进行了gensim代码实践。下周将继续学习GAN的后半部分,并保持具体案例的分析及实践。