此示例演示如何定义文本解码器模型函数。
在深度学习环境中,解码器是深度学习网络的一部分,它将潜在向量映射到某个样本空间。您可以为各种任务使用解码向量。例如
通过使用编码向量初始化反复化网络来文本生成。
通过使用编码的向量作为上下文向量来序列到序列平移。
使用编码的向量作为上下文向量的图像标题。
加载编码数据sonnetsencoded .mat
。此MAT文件包含单词编码,一个迷你批次序列DLX.
,以及相应的编码数据DLZ.
示例中使用的编码器的输出定义文本编码器模型函数。
s=荷载(“十四行诗编码.mat”);enc = s.enc;dlx = s.dlx;dlz = s.dlz;[LatentDimithing,Minibatchsize] =尺寸(DLZ,1:2);
解码器的目标是给定某些初始输入数据和网络状态的序列。
初始化以下模型的参数。
解码器使用初始化编码器输出的LSTM重建输入。对于每个时间步,解码器预测下一个时间步,并将输出用于下一个时间步预测。编码器和解码器使用相同的嵌入。
该模型使用三个操作:
嵌入在范围内的Word Indice映射词汇
对维度的载体嵌入尺寸
哪里词汇
是编码词汇表中的单词数量嵌入尺寸
是嵌入学习的组件数量。
LSTM操作用作输入单个单词矢量和输出1-by-numhidandunits.
向量,在哪里numhidandunits.
是LSTM操作中的隐藏单元的数量。LSTM网络的初始状态(第一次步骤中的状态)是编码向量,因此隐藏单元的数量必须与编码器的潜在维度匹配。
完全连接的操作将输入乘以权重矩阵添加偏置并输出大小的向量词汇
。
指定参数的尺寸。嵌入大小必须匹配编码器。
嵌入尺寸=100;词汇大小=enc.NumWords;numHiddenUnits=最新维度;
为参数创建结构。
参数= struct;
使用高斯使用高斯初始化嵌入的权重initializegaussian.
作为支持文件附加到此示例的函数。请指定平均值0和标准偏差0.01。要了解更多信息,请参阅万博1manbetx高斯初始化。
mu=0;西格玛=0.01;parameters.emb.Weights=初始值高斯([embeddingDimension vocabularySize],μ,σ);
初始化解码器LSTM操作的可学习参数:
学习参数的大小取决于输入的大小。因为LSTM操作的输入是来自嵌入操作的字向量的序列,所以输入通道的数量是嵌入尺寸
。
输入权重矩阵具有大小4 * numhidendunits.
-借-输入大小
哪里输入大小
数据维度是输入的。
循环权重矩阵具有一定的规模4 * numhidendunits.
-借-numhidandunits.
。
偏置载体具有尺寸4 * numhidendunits.
-比1。
sz = [4 * numhidentunits embeddingdimensile];numout = 4 * numhidentunits;numin = embeddingdimension;参数.lstmdecoder.inputwights = initializeglorot(sz,numout,numin);参数.lstmdecoder.recurrentweights = initialize正常([4 * numhidentunits numhidentunits]);参数.lstmdecoder.bias = niginizeUnitForgetgate(numhidentunits);
初始化编码器完全连接操作的可学习参数:
使用Glorot Initializer初始化权重。
使用Zeros初始化偏差initializezeros
将该示例附加的函数作为支持文件。万博1manbetx要了解更多信息,请参阅零初始化。
学习参数的大小取决于输入的大小。因为完全连接操作的输入是LSTM操作的输出,所以输入通道的数量是numhidandunits.
。使完全连接的操作输出向量具有尺寸脱延长
,指定输出大小脱延长
。
权重矩阵的大小不同输出
-借-输入大小
哪里输出
和输入大小
分别对应于输出和输入维度。
偏置载体具有尺寸输出
-比1。
使完全连接的操作输出向量具有尺寸词汇
,指定输出大小词汇
。
InputSize = numhidentunits;Outputsize =词汇;参数.fcdecoder.weights = dlarray(Randn(Randsize,InputSize,“单身”));参数.fcdecoder.bias = dlarray(zeros(outputsize,1,“单身”));
创建功能模型解码器
,列于解码器模型功能示例的部分,计算解码器模型的输出。这模型解码器
函数,将单词索引、模型参数和序列长度作为输入序列,并返回相应的潜在特征向量。
使用自定义培训循环培训深度学习模型时,必须计算有关可读参数的损失的渐变。此计算取决于模型函数的前向通过的输出。
使用解码器生成文本数据有两种常见方法:
闭环 - 对于每个时间步,使用先前预测作为输入进行预测。
打开循环 - 对于每次步骤,使用来自外部源的输入(例如,培训目标)进行预测。
闭环生成是指模型一次生成一个时间步长的数据,并将上一个预测用作下一个预测的输入。与开环生成不同,此过程不需要预测之间的任何输入,最适合于无监督的场景。例如,生成ou的语言翻译模型t一次性输出文本。
使用闭环
使用编码器输出初始化LSTM网络的隐藏状态DLZ.
。
州=结构;state.hiddentstate = dlz;State.cellstate = zeros(大小(dlz),“喜欢”,dlz);
首次步骤,使用一个启动令牌数组作为解码器的输入。为简单起见,从训练数据的第一次执行开始令牌阵列。
decoderInput=dlX(:,:,1);
预先分配解码器输出,使其具有大小numclasses.
-借-小批量
-借-序列长度
使用与此相同的数据类型DLX.
哪里序列长度
是所需的生成长度,例如,训练目标的长度。对于此示例,指定序列长度为16。
Sequencelength = 16;dly = zeros(词汇表,小靶,序列灵长,“喜欢”,dlX);dlY=dlarray(dlY,'CBT');
对于每次步骤,预测序列的下一次步骤使用模型解码器
作用在每次预测之后,找到与解码器输出的最大值对应的索引,并将这些索引用作下一时间步的解码器输入。
为了t = 1:sequencelength [dly(:,:,t),状态] = modeldecoder(参数,解码input,状态);[〜,IDX] = max(dly(:,:,t));DecoderInput = IDX;终止
输出是一个词汇
-借-小批量
-借-序列长度
大堆
尺寸(dly)
ans=1×33595 32 16
此代码片段显示在模型渐变功能中执行闭环生成的示例。
功能渐变=模型渐变(参数、dlX、序列长度)%编码输入。dlz = modelencoder(参数,dlx,sequencelengs);%初始化LSTM状态。州=结构;state.hiddentstate = dlz;State.cellstate = zeros(大小(dlz),“喜欢”,dlz);%初始化解码器输入。decoderInput=dlX(:,:,1);%闭环预测。sequenceLength=大小(dlX,3);dlY=零(NumClass、miniBatchSize、sequenceLength、,“喜欢”,DLX);为了t = 1:sequencelength [dly(:,:,t),状态] = modeldecoder(参数,解码input,状态);[〜,IDX] = max(dly(:,:,t));DecoderInput = IDX;终止%计算损失。%......%计算梯度。%......终止
当使用闭环生成进行训练时,预测序列中每个步骤的最可能单词可能会导致次优结果。例如,在图像字幕工作流程中,如果解码器在给定大象图像时预测字幕的第一个单词是“a”,那么预测下一个单词的“大象”的概率就变得不太可能,因为英语文本中出现短语“大象”的概率极低。
为了帮助网络更快地融合,您可以使用老师强迫:使用目标值作为输入到解码器而不是先前的预测。使用教师强制帮助网络从序列的稍后时间步长学习特征,而无需等待网络正确地生成序列的较早时间步长。
要执行教师强制,请使用ModelEncoder.
直接使用目标序列作为输入。
使用编码器输出初始化LSTM网络的隐藏状态DLZ.
。
州=结构;state.hiddentstate = dlz;State.cellstate = zeros(大小(dlz),“喜欢”,dlz);
使用目标序列作为输入进行预测。
dlY=模型解码器(参数、dlX、状态);
输出是一个词汇
-借-小批量
-借-序列长度
阵列,其中序列长度
是输入序列的长度。
尺寸(dly)
ans=1×33595 32 14
此代码段显示了在模型渐变函数中执行教师强制的示例。
功能渐变=模型渐变(参数、dlX、序列长度)%编码输入。dlZ=模型编码器(参数,dlX,dlZ);%初始化LSTM状态。州=结构;state.hiddentstate = dlz;State.cellstate = zeros(大小(dlz),“喜欢”,dlz);%教师强迫。dlY=模型解码器(参数、dlX、状态);%计算损失。%......%计算梯度。%......终止
这模型解码器
功能,用作输入模型参数,单词索引的序列和网络状态,并返回解码的序列。
因为LSTM.
功能是有状态(当给定时间序列作为输入时,函数传播并更新每个时间步长之间的状态)嵌入
和全协商
默认情况下的功能(当给定时间序列为输入时,函数在每次阶段都运行)独立运行),模型解码器
功能支持顺序和单时万博1manbetx间步输入。
功能[Dly,State] = Modeldecoder(参数,DLX,状态)%嵌入。权重= parameters.emb.weights;DLX =嵌入(DLX,重量);%lstm。inputWeights=parameters.lstmDecoder.inputWeights;recurrentWeights=parameters.lstmDecoder.recurrentWeights;bias=parameters.lstmDecoder.bias;hiddenState=state.hiddenState;cellState=state.cellState;[dlY,hiddenState,cellState]=lstm(dlX,hiddenState,cellState,......输入权重、重复权重、偏差);state.HiddenState=HiddenState;state.CellState=CellState;%完全连接。权重= parameters.fcdecoder.weights;bias = parameters.fcdecoder.bias;dly =全协调(dly,重量,偏见);终止