第十三周:机器学习

news2024/9/29 3:19:36

目录

摘要

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 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)获取指定单词向量:

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:
            pass
    return 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.coloradmin.cn/o/2175658.html

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

相关文章

二叉树的前序遍历,中序遍历,后序遍历(非递归方法+C语言代码)

#include<stdlib.h> #include<stdio.h> #include<assert.h> #include<stdbool.h> //定义一个二叉树结点结构体 typedef int ElemTpye; typedef struct TreeNode {ElemTpye data;struct TreeNode* left;struct TreeNode* right; }TreeNode; //创建结点 …

Autosar EcuM学习笔记-上电初始化执行函数及下电前执行函数

文章目录 前言Autosar标准EcuM启动时的初始化EcuM下电执行过程 总结 前言 Autosar启动和下电过程由EcuM控制&#xff0c;本文介绍EcuM中的初始化和下电前的执行函数 Autosar标准 EcuM启动时的初始化 在标准中&#xff0c;主核启动流程如下&#xff1a; 从核启动流程如下&a…

98问答网是一个怎样的平台?它主要提供哪些服务?

98问答网是一个集知识分享、问题解答与社区交流为一体的综合性在线问答平台。该平台旨在通过汇聚来自各行各业的专家、学者以及广大网友的智慧&#xff0c;为用户提供一个快速获取准确信息、解决生活工作中遇到的各种问题的渠道。 主要服务包括&#xff1a; 问题提问与解答&am…

Mybatis中字段返回值映射问题

需求说明&#xff1a; 返回值列表扩展字段值&#xff0c;不改变原有代码的基础上&#xff0c;增加返回值 编写类VO: public class RegionVO extends Region {//点位数量private Integer nodeCount;public Integer getNodeCount() {return nodeCount;}public void setNodeCou…

scrapy快速上手

安装 除了scrapy本身还要安装两个库 pip install scrapy pip install pywin32 pip install wheel 创建项目 在要创建项目的地方打开powershell scrapy startproject 项目名 我们得到这样的项目结构&#xff0c;功能如下 scrapy.cfg 项目的主配置信息 …

基于STM32的智能人脸识别门锁系统

目录 引言项目背景环境准备 硬件准备软件安装与配置系统设计 系统架构关键技术代码示例 摄像头模块数据采集人脸识别与门锁控制OLED显示与报警功能应用场景结论 1. 引言 随着物联网&#xff08;IoT&#xff09;和人工智能&#xff08;AI&#xff09;技术的发展&#xff0c;智…

ERROR [internal] load metadata for docker.io/library/openjdk:8

ERROR: failed to solve: DeadlineExceeded: DeadlineExceeded: DeadlineExceeded: openjdk:8: failed to do request: Head “https://registry-1.docker.io/v2/library/openjdk/manifests/8”: dial tcp 202.160.129.6:443: i/o timeout 在构建docker镜像时从docker.io/libr…

Unity中的功能解释(数学位置相关和事件)

向量计算 Vector3.Slerp&#xff08;起点坐标&#xff0c;终点坐标&#xff0c;t&#xff09;&#xff0c;可是从起点坐标以一个圆形轨迹到终点坐标&#xff0c;有那么多条轨迹&#xff0c;那怎么办 Vector3.Slerp 进行的是沿球面插值&#xff0c;因此并不是沿着严格的“圆形…

Ubuntu 离线安装 docker

1、下载离线包&#xff0c;网址&#xff1a;https://download.docker.com/linux/ubuntu/dists/xenial/pool/stable/ 离线安装docker需要下载3个包&#xff0c;containerd.io &#xff0c;docker-ce-cli&#xff0c;docker-ce 2、下载完毕后拷贝到ubuntu上用 dpkg 命令安装&am…

【d53】【Java】【力扣】24.两两交换链表中的节点

思路 定义一个指针cur, 先指向头节点&#xff0c; 1.判断后一个节点是否为空&#xff0c;不为空则交换值&#xff0c; 2.指针向后走两次 代码 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}*…

浅谈java异常[Exception]

一&#xff0e; 异常的定义 在《java编程思想》中这样定义 异常&#xff1a;阻止当前方法或作用域继续执行的问题。虽然java中有异常处理机制&#xff0c;但是要明确一点&#xff0c;决不应该用"正常"的态度来看待异常。绝对一点说异常就是某种意义上的错误&#xf…

制造业智能化建设的指标详解

制造业智能化建设的关键监测指标文章浏览阅读284次。10. |绿色化、安全及可靠性|8. |产品全生命周期管理|2. |生产数据自动采集率|4. |数据存储与分析能力|2. |生产数据自动采集率|4. |数据存储与分析能力|5. |企业数字化转型成效|2. |数据中心服务能力|1. |自动化设备应用|2. …

2024年9月25日,Intel发布至强6900P系列:128核心504MB缓存,终于追上AMD!

各位高性能计算领域的朋友们&#xff0c;你们期待已久的消息来了&#xff01; 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; Intel终于发布了至强6900P系列&#xff0c;这款全新的高性能计算&#xff08;HPC&#xff09;服务器处理器&#xff0c;不仅在…

怎样将多个视频合并成一个?7种无损视频合并技巧,1分钟剪辑出大片!

随着社交媒体和视频平台的兴起&#xff0c;身边很多人都开始拍摄vlog来记录自己的生活。剪辑视频最常见的需求就是视频合并&#xff0c;将多个视频合并成一个。视频合并算是比较简单的视频剪辑操作&#xff0c;现在有很多软件支持视频合并功能&#xff0c;本文整理了几个比较简…

windows下载安装pycharm社区版

文章目录 &#x1f315;下载pycharm社区版&#x1f315;安装&#x1f315;配置 如下内容的系统和pycharm版本&#xff1a; windows10系统 PyCharm Community Edition 2024.2.3&#x1f315;下载pycharm社区版 https://www.jetbrains.com.cn/en-us/pycharm/download/? sectio…

蓝桥杯—STM32G431RBT6(TIM定时器输入捕获频率和占空比)

一、什么是输入捕获&#xff1f;对比输出捕获区别&#xff1f; 输入捕获是指对输入信号的特定事件进行检测和记录它主要用于测量输入信号的时间间隔、频率等参数。而输出捕获则是对输出信号的特定事件进行控制和监测。两者的主要区别在于作用对象不同&#xff0c;输入捕获关注的…

JavaWeb图书借阅系统

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 spring-mybatis.xml3.5 spring-mvc.xml3.5 login.jsp 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍&#xff1a;CSDN认证博客专家&#xff0c;CSDN平台Java领域优…

2022浙江省赛G I M

G - Easy Glide 题意 思路 由于数据范围比较小&#xff08;1e3&#xff09;,把所有的移动的时间转化为图论上的边权就可以了,再用dijkstra解决,注意如果用的是邻接表存的话要建双向边 代码 #include <map> #include <set> #include <queue> #include <…

【Linux】修改用户名用户家目录

0、锁定旧用户登录 如果旧用户olduser正在运行中是无法操作的&#xff0c;需要先禁用用户登录&#xff0c;然后杀掉所有此用户的进程。 1. 使用 usermod 命令禁用用户 这将锁定用户账户&#xff0c;使其无法登录&#xff1a; sudo usermod -L olduser2. 停止用户的进程 如…

Python中的机器学习:从入门到实战

机器学习是人工智能领域的一个重要分支&#xff0c;它通过构建模型来使计算机从数据中学习并做出预测或决策。Python凭借其丰富的库和强大的生态系统&#xff0c;成为了机器学习的首选语言。本文将从基础到实战&#xff0c;详细介绍如何使用Python进行机器学习&#xff0c;涵盖…