CBOW 模型的学习的实现:给神经网络准备好学习数据。然后求梯度,并逐步更新权重参数。

Trainer类:学习的类。

初始化:类的初始化程序接收神经网络(模型)和优化器(SGD、Momentum、AdaGrad、Adam)

学习:调用 fit() 方法开始学习。参数:x,输入数据;t,监督标签;max_epoch,进行学习的 epoch 数;batch_size,mini-batch 的大小;eval_interval,输出结果(平均损失等)的间隔。 例如设置 eval_interval=20,则每 20 次迭代计算 1 次平均损失, 并将结果输出到界面上;max_grad,梯度的最大范数。 当梯度的范数超过这个值时,缩小梯度。

 def fit(self, x, t, max_epoch=10, batch_size=32, max_grad=None, eval_interval=20):

plot方法:画出 fit() 方法记录的损失(按照 eval_interval 评价的平均损失)。

class Trainer:def __init__(self, model, optimizer):self.model = modelself.optimizer = optimizerself.loss_list = []self.eval_interval = Noneself.current_epoch = 0def fit(self, x, t, max_epoch=10, batch_size=32, max_grad=None, eval_interval=20):data_size = len(x)max_iters = data_size // batch_sizeself.eval_interval = eval_intervalmodel, optimizer = self.model, self.optimizertotal_loss = 0loss_count = 0start_time = time.time()for epoch in range(max_epoch):# 打乱idx = numpy.random.permutation(numpy.arange(data_size))x = x[idx]t = t[idx]for iters in range(max_iters):batch_x = x[iters*batch_size:(iters+1)*batch_size]batch_t = t[iters*batch_size:(iters+1)*batch_size]# 计算梯度,更新参数loss = model.forward(batch_x, batch_t)model.backward()params, grads = remove_duplicate(model.params, model.grads)  # 将共享的权重整合为1个if max_grad is not None:clip_grads(grads, max_grad)optimizer.update(params, grads)total_loss += lossloss_count += 1# 评价if (eval_interval is not None) and (iters % eval_interval) == 0:avg_loss = total_loss / loss_countelapsed_time = time.time() - start_timeprint('| epoch %d |  iter %d / %d | time %d[s] | loss %.2f'% (self.current_epoch + 1, iters + 1, max_iters, elapsed_time, avg_loss))self.loss_list.append(float(avg_loss))total_loss, loss_count = 0, 0self.current_epoch += 1def plot(self, ylim=None):x = numpy.arange(len(self.loss_list))if ylim is not None:plt.ylim(*ylim)plt.plot(x, self.loss_list, label='train')plt.xlabel('iterations (x' + str(self.eval_interval) + ')')plt.ylabel('loss')plt.show()

这里面使用Trainer 类来执行CBOW 模型的学习。

这个model其实存的就是SimpleCBOW的成员变量。

model = SimpleCBOW(vocab_size, hidden_size)

下面是调用Trainer 类:

trainer = Trainer(model, optimizer)
trainer.fit(contexts, target, max_epoch, batch_size)
trainer.plot()
# coding: utf-8
import sys
sys.path.append('..')  # 为了引入父目录的文件而进行的设定
from common.trainer import Trainer
from common.optimizer import Adam
from simple_cbow import SimpleCBOW
from common.util import preprocess, create_contexts_target, convert_one_hotwindow_size = 1
hidden_size = 5
batch_size = 3
max_epoch = 1000text = 'You say goodbye and I say hello.'
corpus, word_to_id, id_to_word = preprocess(text)vocab_size = len(word_to_id)
contexts, target = create_contexts_target(corpus, window_size)
target = convert_one_hot(target, vocab_size)
contexts = convert_one_hot(contexts, vocab_size)model = SimpleCBOW(vocab_size, hidden_size)
optimizer = Adam()
trainer = Trainer(model, optimizer)trainer.fit(contexts, target, max_epoch, batch_size)
trainer.plot()word_vecs = model.word_vecs
for word_id, word in id_to_word.items():print(word, word_vecs[word_id])

结果:

SimpleCBOW类里面成员变量有下面这个:权重矩阵W_in就是单词的分布式表示。

# 将单词的分布式表示设置为成员变量
self.word_vecs = W_in

那就可以看看单词的分布式表示。

word_vecs = model.word_vecs
for word_id, word in id_to_word.items():print(word, word_vecs[word_id])

结果如下:可见,单词表示为了密集向量

you [-0.9987413   1.0136298  -1.4921554   0.97300434  1.0181936 ]
say [ 1.161595   -1.1513934  -0.25779223 -1.1773298  -1.1531342 ]
goodbye [-0.88470864  0.9155085  -0.30859873  0.9318609   0.9092796 ]
and [ 0.7929211 -0.8148116 -1.8787507 -0.7845257 -0.8028278]
i [-0.8925459   0.95505357 -0.29667985  0.90895575  0.90703803]
hello [-1.0259517   0.97562104 -1.5057516   0.96239203  1.0297285 ]
. [ 1.2134467 -1.1766206  1.6439314 -1.1993438 -1.1676227]

这里面为啥是5个数,其实还是在于权重矩阵W。在SimpleCBOW类里面W_in大小是跟单词数目和hidden_size有关的。

V, H = vocab_size, hidden_size# 初始化权重
W_in = 0.01 * np.random.randn(V, H).astype('f')

在使用Trainer 类来执行CBOW 模型的学习时,设置的hidden_size = 5,所以最后单词就表示成包含五个数的向量了。

CBOW模型的学习:调整权重,以使预测准确。也就是说,上下文是 you 和 goodbye,正确解标签应该是 say,那么如果网络具有良好的权重,对应正确解的神经元(say)的得分应该更高。

对神经网络进行学习,其实是用了Softmax 函数和交叉熵误差。使用 Softmax 函数将得分转化为概率,再求这些概率和监督标签之间的交叉熵误差,并将其作为损失进行学习。推理的 CBOW 模型加上 Softmax 层和 Cross Entropy Error 层,就可以得到损失。

输入侧和输出侧的权重都可以被视为单词的分布式表示,这里面只使用输入侧的权重作为单词的分布式表示。

最后把之前写的CBOW模型类放上来:

class SimpleCBOW:def __init__(self, vocab_size, hidden_size):V, H = vocab_size, hidden_size# 初始化权重W_in = 0.01 * np.random.randn(V, H).astype('f')W_out = 0.01 * np.random.randn(H, V).astype('f')# 生成层self.in_layer0 = MatMul(W_in)self.in_layer1 = MatMul(W_in)self.out_layer = MatMul(W_out)self.loss_layer = SoftmaxWithLoss()# 将所有的权重和梯度整理到列表中layers = [self.in_layer0, self.in_layer1, self.out_layer]self.params, self.grads = [], []for layer in layers:self.params += layer.paramsself.grads += layer.grads# 将单词的分布式表示设置为成员变量self.word_vecs = W_indef forward(self, contexts, target):h0 = self.in_layer0.forward(contexts[:, 0])h1 = self.in_layer1.forward(contexts[:, 1])h = (h0 + h1) * 0.5score = self.out_layer.forward(h)loss = self.loss_layer.forward(score, target)return lossdef backward(self, dout=1):ds = self.loss_layer.backward(dout)da = self.out_layer.backward(ds)da *= 0.5self.in_layer1.backward(da)self.in_layer0.backward(da)return None

CBOW模型的学习、Trainer类的实现相关推荐

  1. 改进版的CBOW模型

    复习 首先复习一下之前的CBOW笔记. 采用推理的方法认知单词.CBOW模型这里面主要是: CBOW模型的核心思路:给出周围的单词(上下文)时,预测目标词处会出现什么单词. 要用神经网络处理单词,需要 ...

  2. word2vec包中cbow模型--学习笔记

    基于Hierarchical softmax的CBOW模型 网络结构:包括3层,分别为输入层,投影层和输出层 假设Context(w)是由词w的前后各c个词组成 输入层:包含Context(w)中2c ...

  3. Keras深度学习实战(25)——使用skip-gram和CBOW模型构建单词向量

    Keras深度学习实战(25)--使用skip-gram和CBOW模型构建单词向量 0. 前言 1. skip-gram 和 CBOW 模型 1.1 CBOW 模型基本原理 1.2 skip-gram ...

  4. 吴恩达深度学习之五《序列模型》学习笔记

    一.循环序列模型 1.1 为什么选择序列模型 如图所示是一些序列数据的例子 1.2 数学符号 如图所示,我们用  表示一个序列的第 t 个元素,t 从 1 开始 NLP中一个单词就是一个元素(又称时间 ...

  5. 决策树模型与学习《一》

    决策树总结<一>.md 决策树模型与学习 1. 定义 一般的,一棵决策树包含一个根结点,若干个内部结点和若干个叶结点:叶结点对应于决策结果,其他每个结点则对应于一个属性测试:每个结点包含的 ...

  6. 如何学习streamdecoder类_如何学习篇5:强化2种能力——2种学习模式之运动类:隐性学习...

    [本文摘要] [注]本文所述内容为学习Yjango<学习观>相关视频之后的总结,观点归Yjango所有,本文仅作为学习之用. 阅读本节,会让你对英语这类运动类知识的学习豁然开朗,你会知道英 ...

  7. 树模型集成学习(Tree Embedding)

    树模型集成学习 集成学习主要有两个思想,分别是bagging和boosting.树模型的集成模型都是使用树作为基模型,最常用的cart树,常见的集成模型有RandomForest.GBDT.Xgboo ...

  8. 参数匹配模型——Python学习之参数(二)

    参数匹配模型--Python学习之参数(二) 文章目录 参数匹配模型--Python学习之参数(二) 位置参数:从左至右进行匹配 关键字参数:通过参数名进行匹配 默认参数:为没有传入值的参数定义参数值 ...

  9. ACL 2021 | 为什么机器阅读理解模型会学习走捷径?

    ©PaperWeekly 原创 · 作者 | Maple小七 学校 | 北京邮电大学硕士生 研究方向 | 自然语言处理 虽然当前的 MRC 模型在不少阅读理解 benchmark 上接近甚至超越了人类 ...

最新文章

  1. CDQ分治 + 树状数组 ---- C. Goodbye Souvenir(三维偏序+思维)
  2. PHP正则表达式规则及常用方法整理
  3. 为什么3年的Java高级程序员薪水仅仅8k-10k,而一个Linux底层C语言程序员两年经验就敢要1...
  4. java从property中取值,JAVA读取PROPERTIES配置文件
  5. 【PM模块】故障维护简介
  6. 好的Java编程习惯
  7. 《python从入门到精通》——生成由数字、字母组成的4位验证码
  8. React-Router ---withRouter
  9. Linux环境下利用句柄恢复Oracle误删除的数据文件
  10. 西班牙语dele等级_西班牙语DELE不同等级是什么水平?
  11. 波卡DOT国库报告:130.89万个DOT被销毁 9.2%DOT 用来资助国库支出议案
  12. HDU 5680 zxa and set 水题
  13. 台大李宏毅2017机器学习国语课程(更新)
  14. Java使用ffmpeg将视频转为Mp4格式
  15. 冒泡排序 java代码实现
  16. 电容或电感的电压_为什么并联电容器可以提高功率因数,而串联不行?
  17. Linux网络编程 -- Linux常用工具的使用(vim、gcc、gdb、makefile、shell)
  18. 问:全局变量是否可以定义在被多个.c文件包含的头文件.h中?
  19. 【 FlutterUnit 食用指南】 开源篇
  20. tolua, luaframework环境搭建

热门文章

  1. 重置Oracle密码
  2. 十、封装python3读写ini文件类
  3. JQuery Datatables editor 本地编辑功能
  4. 大工17秋《计算机文化基础》在线测试1,奥鹏大工15秋《计算机文化基础》在线测试1答案...
  5. c++设计新思维_贵阳花溪区初三冲刺多少钱,新思维
  6. android系统语音合成,android 语音合成报错
  7. 小数分数转换c语言,这是把小数转换成分数的程序,可是输入0.6666无限循环
  8. 小米手机硬改技术_小米11手机爆料:首发骁龙875 或采用屏下摄像头技术
  9. java系统管理员停用,为什么犯错让我成为一个更好的系统管理员
  10. 手机360浏览器怎么清空历史记录 手机360浏览器历史记录清空方法分享