词向量——预训练词嵌入

预训练词嵌入是在一个任务中学习到的嵌入,可用于解决另一个类似的任务。这些嵌入在大型数据集上进行训练、保存,然后用于解决其他任务。这就是为什么预训练的词嵌入是迁移学习的一种形式。

迁移学习,顾名思义,就是将一项任务的学习转移到另一项任务。学习可以是权重或嵌入。在我们的例子中,学习就是嵌入。因此,这个概念被称为预训练词嵌入,在权重的情况下,这个概念被称为预训练模型。

但是,为什么我们首先需要预训练的词向量呢?为什么我们不能从头开始学习词向量呢?

案例研究:从头开始学习词嵌入与预训练词嵌入

让我们通过一个案例研究来比较从头开始学习词嵌入与预训练词嵌入的性能。我们还将旨在了解使用预训练词嵌入是否会提高 NLP 模型的性能。

那么,让我们研究一下文本分类问题——电影评论的情感分析。从这里下载电影评论数据集。

 将数据集加载到我们的 Jupyter Notebook 中
 

#importing libraries
import pandas as pd
import numpy as np#reading csv files
train = pd.read_csv('Train.csv')
valid = pd.read_csv('Valid.csv')             #train_test split
x_tr, y_tr = train['text'].values, train['label'].values
x_val, y_val = valid['text'].values, valid['label'].values
准备数据
 
from keras.preprocessing.text import Tokenizer
from keras.preprocessing.sequence import pad_sequences#Tokenize the sentences
tokenizer = Tokenizer()#preparing vocabulary
tokenizer.fit_on_texts(list(x_tr))#converting text into integer sequences
x_tr_seq  = tokenizer.texts_to_sequences(x_tr) 
x_val_seq = tokenizer.texts_to_sequences(x_val)#padding to prepare sequences of same length
x_tr_seq  = pad_sequences(x_tr_seq, maxlen=100)
x_val_seq = pad_sequences(x_val_seq, maxlen=100)

让我们看一下训练数据中唯一单词的数量:
 

#Create a variable for the size of vocab
size_of_vocabulary=len(tokenizer.word_index) + 1 #+1 for padding
print(size_of_vocabulary)

输出:112204

我们将构建两个具有相同架构的不同 NLP 模型。第一个模型从头开始学习嵌入,第二个模型使用预训练的词嵌入。

定义架构——从头开始学习嵌入
#deep learning library
from keras.models import *
from keras.layers import *
from keras.callbacks import *model=Sequential()#embedding layer
model.add(Embedding(size_of_vocabulary,300,input_length=100,trainable=True)) #lstm layer
model.add(LSTM(128,return_sequences=True,dropout=0.2))#Global Maxpooling
model.add(GlobalMaxPooling1D())#Dense Layer
model.add(Dense(64,activation='relu')) 
model.add(Dense(1,activation='sigmoid')) #Add loss function, metrics, optimizer
model.compile(optimizer='adam', loss='binary_crossentropy',metrics=["acc"]) #Adding callbacks
es = EarlyStopping(monitor='val_loss', mode='min', verbose=1,patience=3)  
mc=ModelCheckpoint('best_model.h5', monitor='val_acc', mode='max', save_best_only=True,verbose=1)  #Print summary of model
print(model.summary())

输出

Model: "sequential"
_________________________________________________________________Layer (type)                Output Shape              Param #   
=================================================================embedding (Embedding)       (None, 100, 300)          33661200  lstm (LSTM)                 (None, 100, 128)          219648    global_max_pooling1d (Glob  (None, 128)               0         alMaxPooling1D)                                                 dense (Dense)               (None, 64)                8256      dense_1 (Dense)             (None, 1)                 65        =================================================================
Total params: 33889169 (129.28 MB)
Trainable params: 33889169 (129.28 MB)
Non-trainable params: 0 (0.00 Byte)
_________________________________________________________________
None

该模型中可训练参数总数为 33,889,169,其中 Embedding 层贡献了 33,661,200 个参数。这非常庞大!

训练模型
import numpy as np
history = model.fit(np.array(x_tr_seq),np.array(y_tr),batch_size=128,epochs=10,validation_data=(np.array(x_val_seq),np.array(y_val)),verbose=1,callbacks=[es,mc])
评估模型性能
#loading best model
from keras.models import load_model
model = load_model('best_model.h5')#evaluation 
_,val_acc = model.evaluate(x_val_seq,y_val, batch_size=128)
print(val_acc)

输出:0.866599977016449

现在,是时候使用 GloVe 预训练的词嵌入构建版本 II 了。让我们将 GloVe 嵌入加载到我们的环境中:

# load the whole embedding into memory
embeddings_index = dict()
f = open('glove.6B.300d.txt')for line in f:values = line.split()word = values[0]coefs = np.asarray(values[1:], dtype='float32')embeddings_index[word] = coefsf.close()
print('Loaded %s word vectors.' % len(embeddings_index))
通过使用预训练的词嵌入分配词汇来创建嵌入矩阵
# create a weight matrix for words in training docs
embedding_matrix = np.zeros((size_of_vocabulary, 300))for word, i in tokenizer.word_index.items():embedding_vector = embeddings_index.get(word)if embedding_vector is not None:embedding_matrix[i] = embedding_vector
定义架构——预训练嵌入
model=Sequential()#embedding layer
model.add(Embedding(size_of_vocabulary,300,weights=[embedding_matrix],input_length=100,trainable=False)) #lstm layer
model.add(LSTM(128,return_sequences=True,dropout=0.2))#Global Maxpooling
model.add(GlobalMaxPooling1D())#Dense Layer
model.add(Dense(64,activation='relu')) 
model.add(Dense(1,activation='sigmoid')) #Add loss function, metrics, optimizer
model.compile(optimizer='adam', loss='binary_crossentropy',metrics=["acc"]) #Adding callbacks
es = EarlyStopping(monitor='val_loss', mode='min', verbose=1,patience=3)  
mc=ModelCheckpoint('best_model.h5', monitor='val_acc', mode='max', save_best_only=True,verbose=1)  #Print summary of model
print(model.summary())
输出:
Model: "sequential_1"
_________________________________________________________________Layer (type)                Output Shape              Param #   
=================================================================embedding_1 (Embedding)     (None, 100, 300)          33661200  lstm_1 (LSTM)               (None, 100, 128)          219648    global_max_pooling1d_1 (Gl  (None, 128)               0         obalMaxPooling1D)                                               dense_2 (Dense)             (None, 64)                8256      dense_3 (Dense)             (None, 1)                 65        =================================================================
Total params: 33889169 (129.28 MB)
Trainable params: 227969 (890.50 KB)
Non-trainable params: 33661200 (128.41 MB)
_________________________________________________________________
None

如你所见,可训练参数的数量只有 227,969。与嵌入层相比,这是一个巨大的下降。

训练模型
history = model.fit(np.array(x_tr_seq),np.array(y_tr),batch_size=128,epochs=10,validation_data=(np.array(x_val_seq),np.array(y_val)),verbose=1,callbacks=[es,mc])
评估模型的性能:
#loading best model
from keras.models import load_model
model = load_model('best_model.h5')#evaluation 
_,val_acc = model.evaluate(x_val_seq,y_val, batch_size=128)
print(val_acc)

输出:0.8827999830245972

与从头开始学习嵌入相比,使用预训练的词嵌入性能有所提高。您可以运行代码,进行一些更改,甚至可以使用机器学习进行尝试。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenIPC开源FPV之Ardupilot配置

OpenIPC开源FPV之Ardupilot配置 1. 源由2. 问题3. 分析3.1 MAVLINK_MSG_ID_RAW_IMU3.2 MAVLINK_MSG_ID_SYS_STATUS3.3 MAVLINK_MSG_ID_BATTERY_STATUS3.4 MAVLINK_MSG_ID_RC_CHANNELS_RAW3.5 MAVLINK_MSG_ID_GPS_RAW_INT3.6 MAVLINK_MSG_ID_VFR_HUD3.7 MAVLINK_MSG_ID_GLOBAL_P…

基于rk356x u-boot版本功能分析及编译相关(二)

🎏技术驱动源于热爱,祝各位学有所成。 文章目录 build.sh脚本分析make.sh编译脚本分析接上,rk3568的u-boot编译在 基于rk356x u-boot版本功能分析及编译相关(一)已有描述,下面针对编译脚本进行分析,在编译之前都进行了哪些工作。 build.sh脚本分析 在编译目录下执行…

二叉树与堆的实现

一 . 概念与结构 在树的概念与结构中树的概念与结构-CSDN博客, 我们发现子结点可以为 0 或者是更多 , 结构较为复杂 , 然后把树的结点个数 加个限制条件 --> 不能超过 2 --> 我们引出了二叉树,在实际运用广 且高效 &#xf…

springboot-springboot官方文档架构

spring官网 >project:spring项目列表,包含了spring一系列框架的List >springboot(也可以换成其他框架):springboot框架 >learn:显示这个框架的各个版本的reference doc和api doc >某版本的reference doc © 著作权归作者所有…

提示工程(Prompt Engineering)指南(进阶篇)

在 Prompt Engineering 的进阶阶段,我们着重关注提示的结构化、复杂任务的分解、反馈循环以及模型的高级特性利用。随着生成式 AI 技术的快速发展,Prompt Engineering 已经从基础的单一指令优化转向了更具系统性的设计思维,并应用于多轮对话、…

【gRPC】什么是RPC——介绍一下RPC

说起RPC,博主使用CPP手搓了一个RPC项目,RPC简单来说,就是远程过程调用:我们一般在本地传入数据进行执行函数,然后返回一个结果;当我们使用RPC之后,我们可以将函数的执行过程放到另外一个服务器上…

基于python的马尔可夫模型初识

基于python的马尔可夫模型初识 **1.什么是随机过程?****1.1模拟赌徒的毁灭Gamblers Ruin** **2.马尔可夫链(Markov Chains)****2.1马尔可夫链模拟****2.2马尔可夫转移概率图****2.3无记忆性:给定现在,未来独立于过去****2.4 n n n 步转移矩阵…

Python金色流星雨

系列目录 序号直达链接爱心系列1Python制作一个无法拒绝的表白界面2Python满屏飘字表白代码3Python无限弹窗满屏表白代码4Python李峋同款可写字版跳动的爱心5Python流星雨代码6Python漂浮爱心代码7Python爱心光波代码8Python普通的玫瑰花代码9Python炫酷的玫瑰花代码10Python多…

Python图像处理——基于ResNet152的人脸识别签到系统(Pytorch框架)

(1)数据集制作 本次使用明星做为数据集,首先编写爬虫函数,根据关键字爬取对应的明星,爬取结果保存至data文件夹,并以标签名作为文件名。具体爬取的明星如下: 注:实际应用中&#xf…

linux下gpio模拟spi三线时序

目录 前言一、配置内容二、驱动代码实现三、总结 前言 本笔记总结linux下使用gpio模拟spi时序的方法,基于arm64架构的一个SOC,linux内核版本为linux5.10.xxx,以驱动三线spi(时钟线sclk,片选cs,sdata数据读和写使用同一…

华为鸿蒙HarmonyOS应用开发者高级认证视频及题库答案

华为鸿蒙开发者高级认证的学习资料 1、课程内容涵盖HarmonyOS系统介绍、DevEco Studio工具使用、UI设计与开发、Ability设计与开发、分布式特性、原子化服务卡片以及应用发布等。每个实验都与课程相匹配,帮助加深理解并掌握技能 2、学习视频资料 华为HarmonyOS开发…

Minio文件服务器:SpringBoot实现文件上传

在Minio文件服务器部署成功后(参考上篇文章Minio文件服务器:安装)接下来我们通过SpringBoot框架写一个接口,来实现文件的上传功能:文件通过SpringBoot接口,上传到Minio文件服务器。并且,如果上传的文件是图片类型&…

2025考研各省市网上确认时间汇总!

2025考研各省市网上确认时间汇总! 安徽:11月1日至5日 福建:11月1日-11月5日 山东:10月31日9:00至11月5日12:00 新疆:10月31日至11月4日17:00 湖南:11月1日9:00-4日12:00 广东:10月下旬至1…

【mysql进阶】4-3. 页结构

页面结构 ⻚在MySQL运⾏的过程中起到了⾮常重要的作⽤,为了能发挥更好的性能,可以结合⾃⼰系统的业务场景和数据⼤⼩,对⻚相关的系统变量进⾏调整,⻚的⼤⼩就是⼀个⾮常重要的调整项。同时关于⻚的结构也要有所了解,以…

Word中Normal.dotm样式模板文件

Normal.dotm文档 首先将自己电脑中C:\Users\自己电脑用户名\AppData\Roaming\Microsoft\Templates路径下的Normal.dotm文件做备份,在下载本文中的Normal.dotm文件,进行替换,重新打开word即可使用。 字体样式如下(可自行修改&#…

Tongweb7049m4+THS6010-6012版本 传真实ip到后端(by yjm+lwq)

遇到客户需要通过ths传真实ip到后端也就是部署到tongweb的需求,在ths的httpserver.conf里的location块配置了以下内容: proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwar…

leetcode hot100(1)

1.160.相交链表 (1)暴力解法 循环遍历listA的所有节点,循环内遍历B所有节点,检查当前遍历到的的A、B中的节点是否一致。 如果一致,标记,跳出循环。 最后根据标记为返回结果。 时间复杂度O(len(A)*len(…

解决torch识别不到cuda的问题——AssertionError: Torch not compiled with CUDA enabled

问题表现 测试torch-gpu是否可用 运行如下代码: import torch print(f"Current device: {device}") print(torch.__version__) # 查看pytorch安装的版本号 print(torch.cuda.is_available()) # 查看cuda是否可用。True为可用&am…

Java学习Day53:铲除紫云山金丹原料厂厂长(手机快速登录、权限控制)

1.手机快速登录 手机快速登录功能,就是通过短信验证码的方式进行登录。这种方式相对于用户名密码登录方式,用户不需要记忆自己的密码,只需要通过输入手机号并获取验证码就可以完成登录,是目前比较流行的登录方式。 前端页面&…

Halcon 多相机统一坐标系(标定)

多相机统一坐标系是指将多个不同位置的相机的图像采集到同一个坐标系下进行处理和分析的方法。 在计算机视觉和机器视觉领域中,多相机统一坐标系被广泛应用于三维重建、立体视觉、目标跟踪等任务中。 以gen_binocular_rectification_map(生成描述图像映…