GPT模型的使用

GPT使用有下面的几个方式:
1.直接使用
https://ner.algomo.com/
这是直接调用GPT-3模型的API,里面的原理待定。

2.对自己所需要的小数据进行预训练
https://github.com/Emir-Liu/GPT2-Chinese
GPT2中文训练,使用了BERT的Tokenizer???。主要使用

3.对模型进行微调之后使用
通过微调预训练的GPT-2模型,来生成特定主题的文本。
http://nlp.seas.harvard.edu/2018/04/03/attention.html
其中,直接使用了transformers模块中的函数,直接加载预训练模块,然后训练??,就结束了,其中训练的过程就是一个黑箱。

上面就是GPT模型的一些使用的方法。
但是,对于初学者来说,更重要的事情是了解黑箱之中是什么原理,以及如何实现。
之前已经了解了GPT模型的原理,下面是学习其实现。

首先BERT和GPT模型都是基于Transformer模型,所以,我简单实现Transformer模型。

在之前已经了解了Transformer模型的原理,那么,其中,有下面多个优化。

例如:
1.参数初始化方式
nn.init.xavier_uniform:参数初始化方式
https://blog.csdn.net/luoxuexiong/article/details/95772045

https://prateekvjoshi.com/2016/03/29/understanding-xavier-initialization-in-deep-neural-networks/

2.Batch Normalization批量归一化
https://zhuanlan.zhihu.com/p/47812375

Normalization 有很多种,但是它们都有一个共同的目的,那就是把输入转化成均值为 0 方差为 1 的数据。我们在把数据送入激活函数之前进行 normalization(归一化),因为我们不希望输入数据落在激活函数的饱和区。

BN:
在每一层的每一批数据上进行归一化。我们可能会对输入数据进行归一化,但是经过该网络层的作用后,我们的数据已经不再是归一化的了。随着这种情况的发展,数据的偏差越来越大,我的反向传播需要考虑到这些大的偏差,这就迫使我们只能使用较小的学习率来防止梯度消失或者梯度爆炸。

BN 的具体做法就是对每一小批数据,在批这个方向上做归一化。

2.学习速率优化
https://blog.csdn.net/luoxuexiong/article/details/90412213

论文:
ADAM: A METHOD FOR STOCHASTIC OPTIMIZATION

Adam是Momentum 和 RMSProp算法的结合

3.过拟合的检验方式

Ubuntu上Jupyter编辑.ipynb文件教程

0.简介

.ipynb文件是python的一种文件格式,可以通过jupyter notebook来打开执行文件。
和简单的.py文件相比,.ipynb文件能够将代码进行分块处理,就能够部分运行,及时查看输出,特别是在展示程序原理。

1.必要文件安装

ipython和jupyter两个安装一下

1
pip3 install xxx

2.使用

1
jupyter notebook

原始GNN和GCN网络详解

0.概述

之前的博客中学习了神经网络,但是,神经网络只能处理简单的类似于表格的数据,其中没有各个数据之间的联系,例如图片数据等。
但是在实际中,我们需要表示各个数据之间的联系,所以我们引入了图结构,图中的节点表示数据,节点之间的线表示各个数据之间的关系,图结构能够表达出比表数据更多的内容。

Read More

信息论及交叉熵解析

0.概述

信息论与信息熵是 AI 或机器学习中非常重要的概念,我们经常需要使用它的关键思想来描述概率分布或者量化概率分布之间的相似性。
我们从最基本的自信息和信息熵到交叉熵讨论了信息论的基础,再由最大似然估计推导出 KL 散度而加强我们对量化分布间相似性的理解。

1.自信息

香农熵的基本概念就是所谓的一个事件背后的自信息(self-information),有时候也叫做不确定性。自信息的直觉解释如下,当某个事件(随机变量)的一个不可能的结果出现时,我们就认为它提供了大量的信息。相反地,当观察到一个经常出现的结果时,我们就认为它具有或提供少量的信息。
例如:
在硬币抛掷实验中,1bit信息代表单独抛掷一个硬币的两个可能的结果。
假如连续三次投掷硬币,一共有2^3=8种可能的结果,每种结果的可能性为0.5^3=0.125。
所以这次实验的自信息为-log_2(0.125) = 3,也就是需要3bit来表示其信息,
这样我们就能够看出,小概率对应着较高的自信息,其定义如下图所示。


上面对数的底数可以为2,但是通常都使用10或者e方便计算,影响不大,因为底数不同仅仅是前面的系数不同。

根据公式,我们可以看出,较小的概率对应着较高的自信息。

当我们面对连续随机变量的情况下,我们针对三种不同的概率密度函数考虑了其对应的信息函数。

2.香农熵(信息熵)

我们到现在一直讨论的都是自信息。在正常的硬币实验中,自信息实际上都等于香农熵,因为所有的结果都是等概率出现的。通常,香农熵是变量的所有可能结果的自信息的期望值。

和之前的一样其底数b可以为任意数值。

推导之后为上面的公式,底数可以为任意值。

上面的三个连续变量分别为冲击函数(0),高斯分布(174)和均匀分布(431),可以看出,越寛的分布有越高的信息熵。例如,高斯分布中,自信息曲线下面的面积远大于均匀分布,但是,需要经过概率加权处理。

3.交叉熵

交叉熵是用来比较两个概率分布p和q的数学工具,和香农熵类似,交叉熵为在概率p的情况下,q的自信息-log(q)的期望。

在信息论中,这个量值代表用q编码方式去编码服从q分布的事件,我们所需要的信息bit数。这是一个衡量概率分布相似性的工具,经常作为损失函数。
同时,交叉熵等于KL散度减去信息熵,当我们最小化交叉熵的时候,后面的信息熵是一个常量,所以能够省略,在这种情况下,交叉熵等于KL散度,因为KL散度能够简单的从最大似然估计推导出來,之后会有以MLE推导KL散度的表达式。

4.KL散度

与交叉熵紧密相关,KL散度是另一个在机器学习中衡量相似度的量。
从q到p的KL散度如下图所示。

用q来近似p的时候造成的信息损失。和上面的交叉熵相比,减了一个常数项,从优化的目标进行考虑,两者是等价的。其属性为,当p和q相同的时候,KL散度的数值为0.

还有,KL散度为非负的,二期衡量的是两个分布之间的差异,通常用来分布之间的某种距离。然而,并未真的距离,因为它不是对称的。

5.通过极大似然估计推导KL散度

参考李宏毅教授的讲解中,假如给定一个样本数据的分布P_data(x)和生成数据的分布P_g(x;θ)

上面的推导过程中,我们需要最大化似然函数,然后对最大似然函数取对数,然后将乘法转换为加法,接着转换为期望,然后减去信息熵,就得到了KL散度。

GPT-3教程

0.概述

GPT-3(Generative Pre-trained Transformer 3)是一种自动回归语言模型(这是什么东西?)。
使用基于Transformer的深度学习神经网络生成类似于人写的文本。其完整版本包含了1750亿个机器学习的参数。
GPT-3在2020年5月推出,在7月进行Beta测试。

Read More

Python中常用模块

0.模块列表

1.fire
2.gensim

1.详细解释

1.fire

生成命令行界面,不需要额外的工作,只用调用fire.Fire()

2.gensim

NLP相关的模块,包含了TF-IDF等多个算法,计算文本相似度等。还没有用过。

anaconda教程

0.简介

Anaconda是开源的包、环境管理器,里面包含大量安装好的工具包.最主要的是能够通过它进行不同版本的python环境的安装和切换。
例如tensorflow模块经常更新,很多程序都是在1.xx版本,最新的2.xx版本的资料不够详细。所以,我们在不同版本的tensorflow的时候,我们就可以直接在tensorflow中运行程序。
但是觉得挺麻烦的,在Ubuntu环境下可以直接下载两个版本的Python,直接使用。

下载anaconda:

1
2
wget xxx #从官网下载,xxx为连接
bash xxx.sh

注意里面的选项,最后一个是yes

在ubuntu上安装了Anaconda之后,每次启动终端就会自动进入conda的base环境,可以通过如下指令退出conda环境:

1
conda deactivate

但是考虑到每次都需要执行这一步才能退出,比较麻烦,因此想要启动终端后不进入conda环境。网上推荐通过修改conda的config文件来实现:

1
conda config --set auto_activate_base false

1.Anaconda环境切换及使用:

查看当前的环境

1
2
conda info -e
python -V

新建环境,选择python版本

1
2
3
4
5
6
7
8
9
10
11
12
13
conda create --name torch0.3 python=3.5
其中 torch0.3是新环境的名字,python=3.5是选择的python版本
#conda create --name python32 --clone python321
#conda remove --name old_name --all

激活切换环境
conda activate torch0.3

回到之前的环境
conda deactivate

删除一个已有的环境
conda remove --name torch0.3 --all

我需要一个pytorch0.3版本,但是官网上已经没有wins下的该版本,所以直接使用anaconda官网下的链接进行下载

1
conda install -c peterjc123 pytorch

我们建立了新的环境,但是spyder依旧是过去的怎么版。安装新spyder,然后打开spyder

1
2
conda install spyder
spyder

FAQ:

在Spyder中如何弹出窗口动态显示图片:

Tools–>Preferences–>IPython console–>Graphics–>Graphics backend–> Backend–>设置成Automatic

当下载超时的时候该怎么办?

当国内没有镜像的时候直接在Anaconda Cload上搜索
修改.condarc文件,切换国内源

conda config –show-sources

恢复默认源
conda config –remove-key channels

其中只有default源,我们可以通过
conda config –add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
来添加镜像

显示通道地址
conda config –set show_channel_urls yes

或者直接在windows:C:\users\username\,linux:/home/username/下的.condarc文件中修改
channels:

GraphSAGE

GCN是一种在图中结合拓扑结构和顶点属性信息学习顶点的embedding表示的方法。然而GCN要求在一个确定的图中去学习顶点的embedding,无法直接泛化到在训练过程没有出现过的顶点,即属于一种直推式(transductive)的学习。

本文介绍的GraphSAGE则是一种能够利用顶点的属性信息高效产生未知顶点embedding的一种归纳式(inductive)学习的框架。

其核心思想是通过学习一个对邻居顶点进行聚合表示的函数来产生目标顶点的embedding向量。

GraphSAGE 是Graph SAmple and aggreGatE的缩写,其运行流程如上图所示,可以分为三个步骤

  1. 对图中每个顶点邻居顶点进行采样

  2. 根据聚合函数聚合邻居顶点蕴含的信息

  3. 得到图中各顶点的向量表示供下游任务使用

但是GCN在NLP方面已经可以很好地实现。所以,这个方面的研究待定。

TMP

最近自己比较忙,而且,感觉自己的系统快不堪重负了。
而且,自己的需求又特别多。
不会做就不会死。
最近打算重装一下Ubuntu系统,之前在系统上累积的错误越来越多了,
然后,自己最近写关于神经网络的博客中,有很多公式,截图是真的累,所以,我有一个大胆的想法,不如换个框架吧,python的那个什么D框架想试一试。
然后,还有NLP自然语言处理的任务要做。
而且,国内的开源软件,没有找到对自己有用的,心情很难受。
我觉得自己还有很多事情可以做。
恩,最近我可能又要消失一段时间了。
很多的东西都只做了一部分,等我去填坑。
大家在做死的道路上,且做且珍惜。