第十三周:机器学习

目录

摘要

Abstract

一、生成式对抗网络(上)

1、引入——generator

2、discriminator

3、GAN算法

4、GAN的理论

5、GAN的训练技巧

二、word2vec——gensim实践

1、引入

2、 word2vec模型 

3、fasttext模型

总结


摘要

本周学习了对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等等。

上图可以看出,P_G代表输出的complex distribution,P_{data}代表真正图片形成的distribution,函数Div(P_G,P_{data})用来表示机器生成图片与真实图片的差距大小。我们希望找到一个generator使得二者的差距最小,也就是找到函数Div()的最小值G^*

KL散度: 又称为相对熵,是两个概率分布间差异的非对称性度量 

问题:我们不知道P_GP_{data}的分布是什么,并且散度函数的计算比较复杂

解决:不需要知道以上两个的具体分布函数,只需要进行采样即可,如下图:

从database中采样一部分真实图片,从一组向量中采样出一部分机器生成的图片。最终计算出上式最小值。

问题:如何选择合适的P_GP_{data} 作为Div()函数的取值

解决:Div()函数的本质就是分辨真实图片和虚假图片,所以要求取得的散度最大。此时就需要用到discriminator,真实图片(从P_{data}中sample出来)的scalar值大、机器生成图片(从P_G中sample出来)的scalar值小。

实际上,我们把Div()函数转化成了对函数V(D,G)求最大值,V(D,G)又可以表示成交叉熵的计算形式(此时式子中的未知数只有discriminator的输出值D(y))。有些类似于二分类的任务。

如果说,训练得到的V(D,G)最大值较小,说明真实图片和虚假图片差别较小,效果不好;若是V(D,G)最大值较大,说明真实图片和虚假图片差别较大,效果较好。

5、GAN的训练技巧

 JS divergence:定义于两个概率分布上,根据KL散度构造,同样描述了两个概率分布的差异,且具有对称性。

 

(1)JS divergence是不合适的

P_GP_{data} 重合度很小:本身分布的重合度小;本身分布有重合,但是sample的点不重合

问题:如果P_GP_{data} 无重合,那么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需要设定的参数以及所用到的函数。

from gensim.models import Word2Vectest_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)获取指定单词向量:

model.wv.get_vector('when')

 对应前面设定的模型参数vector_size=20,每个单词的维度都是20

 (2)找到前topn个(与指定单词相似性最高)的单词 

model.wv.similar_by_word('beauty',topn=5)

 

模型依次计算了“beauty”与其他单词的相似度,输出前几个相似度最高的单词。 

在后续介绍两种处理词嵌入的模型,word2vec模型和fasttext模型,其中word2vec模型是不含有ngram的信息,而fasttext模型是含有ngram的信息。下面会分开介绍二者对于两种任务的处理,并做出对比。

2、 word2vec模型 

step1 导入必要的库包

from gensim.models import fasttext
from gensim.models import word2vec
import pandas as pd
import logging
import jieba

step2 数据载入与预处理

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:passreturn sen_list   
# 将数据变成gensim中 word2wec函数的数据格式
sens_list = [segment_sen(i) for i in data]
print(sens_list)

jieba库中的lcut方法可以直接对文本进行分词,最后结果是一个词语列表sens_list,如下图: 

step3 word2vec模型训练

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:已知中心词,预测周围词

model1.wv.most_similar('飞机','飞行')

 

任务2 skip-gram:已知周围词,预测中心词

model2.wv.most_similar('飞机')

 

3、fasttext模型

step1-step3 与word2vec模型相同

step4 结果预测 

任务1:cbow模型

model3.wv.most_similar('记者','飞行')

任务2:skip-gram模型 

model4.wv.most_similar('飞机')

 

两个模型对比 

 在cbow任务进行后输出如下:输入的周围词是“飞机”、“飞行”

结论1:可以看出,右边的相似度总体要高于左边模型,得出fasttext模型对于小段文本更优。同理对比skip-gram任务也是fasttext更优。

model.wv.most_similar('人工智能')

 

结论2:若是碰到未登录词(文本中没有包含的),word2vec模型将会报错,但是fasttext模型将会根据所学的预测输出相似的单词。对比得出,fasttext模型针对未登录词更优。

有文章https://rare-technologies.com/fasttext-and-gensim-word-embeddings/表明,fasttext模型较优的原因是因为其含有ngram的信息,一旦不含有ngram那么其预测的准确度会大大下降。如下图所示:

总结

本周学习了GAN的基础概念以及其算法和理论推导,并且进行了gensim代码实践。下周将继续学习GAN的后半部分,并保持具体案例的分析及实践。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1549681.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

栏目一:使用echarts绘制简单图形

栏目一:使用echarts绘制简单图形 前言1. 在线编辑图形1.1 折线图1.2 柱状图1.3 扇形图 2. 本地绘制图表2.1 下载echarts.min.js2.2 创建一个简单的图形 前言 Echarts是一款基于JavaScript的可视化图表库。它提供了丰富的图表类型和交互功能,可以用于在网…

qt6 使用QPSQL

qt6 自带pg数据库驱动: pro文件加个说明: 引用位置添加(按需添加,这里我就大致加一下): test code: 理想情况当然是要用pool,这里只是演示调用而已 QSqlError DbTool::testConnection(const QString &…

JSON的C实现(上)

JSON的C实现(上) JSON的C实现(上)前言JSON简介JSON的C实现思路小结 JSON的C实现(上) 前言 JSON是众多项目中较为常见的数据交换格式,为不同项目、系统间的信息交换提供了一个规范化标准。JSON…

测试用例的进阶二

1. 按开发阶段划分 1.1 测试金字塔 从上到下,对于测试人员代码就是要求越来越低; 从下到上,越来越靠近用户; 从下到上,定位问题的成本越来越高; 1.2 单元测试(Unit Testing) 单元测试是对软件组成单元进…

《迁移学习》—— 将 ResNet18 模型迁移到食物分类项目中

文章目录 一、迁移学习的简单介绍1.迁移学习是什么?2.迁移学习的步骤 二、数据集介绍三、代码实现1. 步骤2.所用到方法介绍的文章链接3. 完整代码 一、迁移学习的简单介绍 1.迁移学习是什么? 迁移学习是指利用已经训练好的模型,在新的任务上…

Linux防火墙-常用命令,零基础入门到精通,收藏这一篇就够了

我们经过上小章节讲了Linux的部分进阶命令,我们接下来一章节来讲讲Linux防火墙。由于目前以云服务器为主,而云服务器基本上就不会使用系统自带的防火墙,而是使用安全组来代替了防火墙的功能,可以简单理解安全组就是web版的防火墙&…

Windows环境下训练开源图像超分项目 ECBSR 教程

ECBSR 介绍 ECBSR(Edge-oriented Convolution Block for Real-time Super Resolution)是一种针对移动设备设计的轻量级超分辨率网络。它的核心是一种可重参数化的构建模块,称为边缘导向卷积块(ECB),这种模…

Qt 首次配置 Qt Creator 14.01 for Python

前言: 如何用QT实现Python的配置的交互界面。本文从0开始,进行实践的介绍。 在上一节里面,我们做了社区版本的配置: https://blog.csdn.net/yellow_hill/article/details/142597007?spm1001.2014.3001.5501 这一节&#xff0…

vue+UEditor附件上传问题

🏆本文收录于《全栈Bug调优(实战版)》专栏,主要记录项目实战过程中所遇到的Bug或因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&am…

快速实现AI搜索!Fivetran 支持 Milvus 作为数据迁移目标

Fivetran 现已支持 Milvus 向量数据库作为数据迁移的目标,能够有效简化 RAG 应用和 AI 搜索中数据源接入的流程。 数据是 AI 应用的支柱,无缝连接数据是充分释放数据潜力的关键。非结构化数据对于企业搜索和检索增强生成(RAG)聊天…

Java SPI 原理、样例

在 Java 中,SPI(Service Provider Interface)全称为服务提供者接口,它是一种用于实现框架扩展和插件化的机制。 一、SPI 作用 允许在运行时动态地为接口查找服务实现,而不需要在代码中显式地指定具体的实现类。 这使得…

利用多模态输入的自我中心运动跟踪与理解框架:EgoLM

随着增强现实(AR)和虚拟现实(VR)技术的发展,对自我中心(第一人称视角)运动的精确跟踪和理解变得越来越重要。传统的单一模态方法在处理复杂场景时存在诸多局限性。为了解决这些问题,研究者们提出了一种基于多模态输入的自我中心运动跟踪与理解框架——EgoLM。本文将详细…

MySQL-数据库约束

1.约束类型 类型说明NOT NULL非空约束 指定非空约束的列不能存储NULL值 DEFAULT默认约束当没有给列赋值时使用的默认值UNIQUE唯一约束指定唯一约束的列每行数据必须有唯一的值PRIMARY KEY主键约束NOT NULL和UNIQUE的结合,可以指定一个列霍多个列,有助于…

文章解读与仿真程序复现思路——中国电机工程学报EI\CSCD\北大核心《考虑异步区域调频资源互济的电能、惯性与一次调频联合优化出清模型》

本专栏栏目提供文章与程序复现思路,具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

Android页面跳转与返回机制详解

在Android开发中,页面跳转是实现应用功能交互的重要手段之一。本文将从Activity之间的跳转、Activity与Fragment之间的跳转、Fragment之间的跳转以及页面返回的问题四个方面进行详细解析。 一、Activity之间的跳转 Activity是Android应用的基本构建块,…

7.6透视变换

基本概念 在计算机视觉和图像处理领域中,透视变换(Perspective Transformation)是一种重要的几何变换,用于模拟从一个视角到另一个视角的变换,比如从鸟瞰视角到正面视角的变换。透视变换通常用于图像配准、增强现实、…

《志愿军·存亡之战》首映礼热血与感动并存,陈飞宇一年后再报这串番号

9月27日,国庆档电影《志愿军:存亡之战》在北京举行首映礼。导演陈凯歌,总制片人陈红,编剧张珂,演员朱一龙、辛柏青、张子枫、朱亚文、陈飞宇、张宥浩等在映后齐亮相。其中陈飞宇饰演的孙醒,作为贯穿一、二两…

如何快速自定义一个Spring Boot Starter!!

目录 引言: 一. 我们先创建一个starter模块 二. 创建一个自动配置类 三. 测试启动 引言: 在我们项目中,可能经常用到别人的第三方依赖,又是引入依赖,又要自定义配置,非常繁琐,当我们另一个项…

【C++报错已解决】std::ios_base::floatfield

🎬 鸽芷咕:个人主页 🔥 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 专栏介绍 在软件开发和日常使用中,BUG是不可避免的。本专栏致力于为广大开发者和技术爱好者提供一个关于BUG解决的经…

8609 哈夫曼树

### 思路 1. **选择最小权值节点**:在哈夫曼树构建过程中,选择两个权值最小且父节点为0的节点。 2. **构建哈夫曼树**:根据权值构建哈夫曼树,确保左子树权值小于右子树权值。 3. **生成哈夫曼编码**:从叶子节点到根节点…