。
このこのでは,アテンションアテンション使使した再序序列序号化器 - 尺号化器モデルモデルをてに字列ををに変换方法
再帰型符号化器材 - 复号化器モデルは,要旨のテキストの要约ニューラル械翻訳のようタスクにおけるにおける性がされれれていますいますますますい。このモデルは,通讯,lstmのような再帰层のようを管理する“钢号化器”と,第2の再帰层で符化されたた“復号化器”で構成されます。“アテンションメカニズム”を组み込んだモデルでは,変换を生成しながら,符変换化された入の部ににこと能能入の焦点に当てること能能能焦点焦点化当てる当てること能能
符号化器モデルについて,この例では1つの埋め込みとそれに続く2つのLSTM演算で構成されるシンプルなネットワークを使用します。埋め込みとは,直言トークンを数値ベクトルに変換する手法です。
复号化器モデル,この例では2つのlstmから成る符ネットワークと非常ます。ただし,重要なは,复ネットワーク化はますただし化が化はアテンション化化が含まれることアテンションはメカニズムにより,复号化器が号化器のの力の特价の“注意を払う”ことができます。
“romannumerals.csv”
から数とローマとのをダウンロードします。
filename = fullfile(“romannumerals.csv”);选项= detectimportoptions(文件名,......'texttype'那“字符串”那......'readvariablenames',错误的);options.variablenames = [“来源”“目标”];options.variabletypes = [“细绳”“细绳”];data = readtable(文件名,选项);
データデータ学习用来とテストの区画区画区画50%ずつ分享します。
IDX = RANDPERM(大小(数据,1),500);DataTrain =数据(IDX,:);dataTest =数据;dataTest(idx,:) = [];
数字とローマ数字のペアの一部を表示します。
头(dataTrain)
ans =8×2表源目标_______________“228”“CCLXVIII”“CCLXVII”“294”“CCXCIV”“179”“CLXXIX”“396”“CCCXCVI”“2”“II”“4”“4”“270”“”270“”cclxx“
例の最后にリストさているいる关联transformText
をを用し,テキストテキストデータの定理を行い。关联transformText
は,テキストを文字にして开放と停止トークントークン追にしテキストののとにをますますを字トークンではなく単语ます。,最初の手顺をスキップします。
StartToken =.“<开始>”;停止=“” ;strsource = dataTrain {:,1};documentsource = transformtext(strsource,starttoken,stowtoken);
Wordencoding.
オブジェクトオブジェクトは,ボキャブラリを使相互このしますこのしマッピングししマッピングマッピングしこのマッピングオブジェクトしこのマッピングオブジェクトししマッピングししししし
encsource = wordencoding(documentsource);
単語符号化を使用し,ソースのテキストデータを数値のシーケンスに変換します。
sequencessource = doc2sequence(encsource,documentSource,'paddingdirection'那'没有任何');
同じ同じ手顺でターゲットターゲットデータをに変换ししシーケンスに変换し
strtarget = dataTrain {:,2};DocumentStarget = TransformText(strtarget,starttoken,stowtoken);enctarget = Wordencoding(DocumentStarget);sequencestarget = doc2sequence(enctarget,documentstarget,'paddingdirection'那'没有任何');
モデルパラメーターを初期化します。符号化器と復号化器のそれぞれについて,128の埋め込み次元,200個の隠れユニットをもつ2つのLSTM層,および確率0.05でランダムにドロップアウトするドロップアウト層を指定します。
embeddingDimension = 128;numhidendunits = 200;辍学= 0.05;
关节initializegaussian.
を使用し,ガウスで符号化埋め込みの重みを初期化します。この关数は,この例にサポートファイルとして添付されています。平均値を0,标准偏差を0.01に指定します。详细については,ガウスによる初期化を参照してください。
inputsize = encsource.numwords + 1;sz = [embeddingdimension输入];μ= 0;σ= 0.01;parameters.encoder.emb.weights = initializegaussian(sz,mu,sigma);
符号化器のLSTM演算に関する学習可能なパラメーターを次のように初期化します。
关节initializeglorot.
をを使用し,GLOROT初期化子ででののをますます。详细れいますとしてれは。Glorotの初期化を参照してください。
关节初始化正交
介绍使用し,直交直交期化子で再帰重みををします。この関数は,この例にサポートファイルとして添付されています。詳細については,直交初期化を参照してください。
关节initializeUnitForgetGate
をユニット忘却ゲートますますをは,この例にます添付れて。ユニットユニット忘却ゲートによるによる期化を参照してください。
最初の符号化器のLSTM演算に関する学習可能なパラメーターを初期化します。
sz = [4*numHiddenUnits embedddingdimension];numOut = 4 * numHiddenUnits;numIn = embeddingDimension;parameters.encoder.lstm1。InputWeights = initializeGlorot(深圳、numOut numIn);parameters.encoder.lstm1。RecurrentWeights = initialize正交([4*numHiddenUnits numHiddenUnits]);parameters.encoder.lstm1。偏见= initializeUnitForgetGate (numHiddenUnits);
2番目の符号化器のLSTM演算に关键词习能なパラメーターをます。
sz = [4*numHiddenUnits numHiddenUnits];numOut = 4 * numHiddenUnits;numIn = numHiddenUnits;parameters.encoder.lstm2.inputweights = initializeglorot(sz,numout,numin);parameters.encoder.lstm2.recurrentweights = initialize正常([4 * numhidentunits numhidentunits]);parameters.encoder.lstm2.bias = initializeUnitForgetgate(numhidentunits);
关节initializegaussian.
を使用し,ガウスで符号化埋め込みの重みを初期化します。平均値を0,標準偏差を0.01に指定します。
outputSize = encTarget。NumWords + 1;sz =[嵌入尺寸outputSize];μ= 0;σ= 0.01;parameters.decoder.emb.Weights = initializeGaussian (sz、μ、σ);
关节initializeglorot.
,GLOROT初期化岩でアテンションメカニズムのをますます。
sz = [numhidendunits numhidentunits];numout = numhidendunits;numIn = numHiddenUnits;参数.decoder.attn.weights = initializeglorot(sz,numout,numin);
展示化器のLSTM演算に关键词习能能なを次ようににしします。
关节initializeglorot.
,GLOROT寿期化子でで力のの重みをますます。
关节初始化正交
介绍使用し,直交直交期化子で再帰重みををします。
关节initializeUnitForgetGate
ZHAILSⅣ型杂矿〖。
最初の复号化器のLSTM演算に关键词习能ななををます。
sz = [4 * numhidentunits Embeddingdimension + numhidentunits];numOut = 4 * numHiddenUnits;numin = embeddingdimension + numhidendunits;参数.decoder.lstm1.inputwights = initializeglorot(sz,numout,numin);参数.decoder.lstm1.recurrentweights = initialize正常([4 * numhidentunits numhidentunits]);参数.decoder.lstm1.bias = niginizeUnitForgetgate(numhidentunits);
2番目の复号化器のLSTM演算に关键词习能なパラメーターをます。
sz = [4*numHiddenUnits numHiddenUnits];numOut = 4 * numHiddenUnits;numIn = numHiddenUnits;parameters.decoder.lstm2.InputWeights = initializeGlorot(深圳、numOut numIn);parameter.decoder.lstm2 . recurrentweights = initialize正交([4*numHiddenUnits numHiddenUnits]);parameters.decoder.lstm2.Bias = initializeUnitForgetGate (numHiddenUnits);
展示化具のの全演算关键词杂交学院可致以习パラメーター。
GLOROT寿期化子液をして重みをますます。
关节initializezeros
を使用し,ゼロでバイアスを初期化します。この关数は,この例にサポートファイルとして添付されています。详细については,ゼロゼロでの期化を参照してください。
sz = [输出2 * numhidentunits];numout =输出;numin = 2 * numhidendunits;参数.decoder.fc.weights = initializeglorot(sz,numout,numin);参数.decoder.fc.bias = initializezeros([输出1]);
このこの例の最后最后にリストされて关词ModelEncoder.
およびmodelDecoder
作者:郝责人JOURNAL
この例の符号化器モデル关联の節にリストされている関数ModelEncoder.
は,入力データ,モデルパラメーター,学習の正しい出力の判断に使用するオプションのマスクを受け取り,モデルの出力とLSTMの隠れ状態を返します。
この例の复号化器モデル关联の節にリストされている関数modelDecoder
は,入力データ,モデルパラメーター,コンテキストベクトル,LSTMの初期隠れ状態,符号化器の出力,およびドロップアウトの確率を受け取り,復号化器の出力,更新されたコンテキストベクトル,更新されたLSTM状態,およびアテンションスコアを返します。
この例のモデル勾配関数の節にリストされている関数modelGradients
を作物成し。この关键,符号化器とととパラメーターパラメーター,入力データのミニととデータにするパディングマスク,およびドロップアウト确率を受け取り,学校可なモデルパラメーターについての损失勾配勾配,対応する损失をます。
ミニバッチサイズを32岁学習率0.002をとして75エポック学習させます。
minibatchsize = 32;numepochs = 75;学习= 0.002;
ADAMののオプションををしし。
梯度Dayfactor = 0.9;squaredgradientdecayfactor = 0.999;
カスタム学習ループを使用してモデルに学習させます。
シーケンス長の昇順に並べ替えたシーケンスで学習させます。その結果,バッチ内のシーケンスのシーケンス長がほぼ同じになり,小さいシーケンスのバッチを長いシーケンスのバッチよりも先にモデルの更新に確実に使用できます。
シーケンスシーケンスを长ささで并べ替えべ替え
Sequencelengths = Cellfun(@(序列)大小(序列,2),Sequencessource);[〜,IDX] =排序(Sequencelength);Sequencessource = Sequencessource(IDX);sequencestarget = sequencestarget(IDX);
学習の進行状況プロットを初期化します。
图lineloSstrain =动画线(“颜色”,[0.85 0.325 0.098]);ylim([0 inf])xlabel(“迭代”)ylabel(“失利”网格)上
关节adamupdate
用来ののををます。
trailingavg = [];trailingavgsq = [];
モデルに学習させます。各ミニバッチで次を行います。
シーケンスのミニバッチを読み取り,パディングを追加します。
データをdlarray.
に変换。
損失と勾配を計算。
关节adamupdate
采用しをててての符および化てパラメーターパラメーターパラメーターををパラメーターパラメーター。
学习の进行状况をプロットを新します。
numobservations = numel(Sequencessource);numiterationsperepoch = bloor(numobservations / minibatchsize);迭代= 0;start = tic;%循环epochs。为了epoch = 1:numepochs%循环在迷你批次。为了i = 1:numiterationsPerepoch迭代=迭代+ 1;%读取迷你批次数据和垫。IDX =(I-1)*小匹匹配+ 1:i *小匹匹配;[x,sequencelengthssource] = PAD序列(Sequencessource(IDX),输入);[t,sequencelengthstarget] = pad sequences(sequencestarget(idx),输出);%将小批数据转换为dlarray。dlX = dlarray (X);%计算损失和梯度。[渐变,损失] = DLFeval(@Modelgradients,参数,DLX,T,......SequenceLengthssource,sequencelengthstarget,丢弃);使用adamupdate更新参数。[参数,trailingavg,trailingavgsq] = adamupdate(参数,渐变,trailingavg,trailingavgsq,......迭代,学习,渐变级别,squaredgradientdecayfactor);%显示培训进度。d =持续时间(0,0,toc(start),'格式'那'hh:mm:ss');addpoints (lineLossTrain、迭代、双(收集(损失)))标题(“时代:”+ epoch +“,经过:”+字符串(d))绘制结尾结尾
学习済みのモデルををし新闻データの変换生成するする,学习时とは手顺をしてテキストデータ数据のシーケンス変换し,そのシーケンスを符にににし,トークンインデックスを使使て结果のをテキストに変换直します。
学習時と同じ手順を使用してテキストデータを前処理します。このこの例の最后最后にリストされて关词transformText
を使用し,テキストを文字に分割して開始と停止のトークンを追加します。
你要=人数({:1};strTarget =人数({:2};
关节modelPredictions
をを用してテキストを変换ますますます。
max sequencelength = 10;delimiter =.“;strtranslated = translateText(参数,strsource,max sequencelength,minibatchsize,......encsource,enctarget,starttoken,streptoken,delimiter);
テストソーステキスト,ターゲットテキスト,および変換結果を格納する表を作成します。
TBL =表;tbl.source = strsource;tbl.target = strtarget;tbl.ranslated = strtranslated;
ランダムランダムに选択しした変换を表示しし结果を表示し
IDX = RANDPERM(大小(DataTest,1),小匹匹匹匹配);tbl(idx,:)
ans =32×3表源目标翻译______ _____________________“936”“cmxxxvi”“cmxxxvi”“423”“cdxxiii”“cdxxiii”“cmmlxxxi”“cmlxxxi”“cmlxxxxi”“200”“cc”“cc”“cc”“cc”“224”“ccxxiv”“ccxxiv”的“ccxxiv”“ccxxiv“”56“”LVI“”DLVI“”330“”CCCXXX“”CCCXXX“”336“”CCCXXXVI“”CCCXXXVI“”524“”DXXIV“”DXXIV“”DXXIV“”860“”DCCCLX“”DCCCLX“”DCCCLX“”318“”CCCXVIII“”CCCXVIII“”902“”CMII“”CMII“”681“”DCLXXXI“”DCLXXXI“”DCLXXXI“”CCXCIX“”CCXCIX“”931“”CMXXXI“”CMXXXIX“”859“”DCCCLIX“”DCCCLIX“”DCCCLIX“”DCCCLIX“⋮
关节transformText
は,テキストを文字にして开放と停止トークントークン追にしテキストののとにをますますを字トークンではなく単语ます。,最初の手顺をスキップします。
功能documents = transformText(str,startToken,stopToken)“那”“));str = startToken + str + stopToken;文件= tokenizedDocument (str,'CustomTokens',[StartToken TreadToken]);结尾
关节padSequences
はシーケンスのミニバッチとパディング値を受け取り,パディングされたシーケンスと対応するパディングマスクを返します。
功能[x,sequencelengths] = pad序列(序列,paddingsvalue)用填充初始化小批处理。numobservations = size(序列,1);Sequencelengths = Cellfun(@(x)大小(x,2),序列);maxlength = max(sequencelengths);x = repmat(paddingsvalue,[1 numobservations maxlength]);%插入序列。为了n = 1:numobservations x(1,n,1:sequencelengths(n))=序列{n};结尾结尾
关节modelGradients
は,符号化器と码化器材ののパラメーター,入力データのミニバッチと力データににパディングパディング,およびドロップアウトのを受け取り,学校习なモデルパラメーターについて损失勾配とパラメーターについてのと,対応すると返します。
功能[gradients, loss] = modelGradients(parameters, dlX, T,......SequenceLengthssource,sequencelengthstarget,丢弃)通过编码器转发%。[dlz,hiddenstate] = modelencoder(parameters.encoder,dlx,sequencelengthssource);%解码器输出。doteacher强迫= rand < 0.5;sequenceLength =大小(T, 3);海底= decoderPredictions (hiddenState parameters.decoder, dlZ, T,辍学,......doteacherforcing,sequencelength);%掩蔽损失。dly = dly(:,:,1:结束-1);t = t(:,:,2:结束);t = onehotencode(t,1,“类名”,1:尺寸(dly,1));丢失= maskedcrossentropy(dly,t,sequencelengthstarget-1);%更新渐变。梯度= dlgradient(损耗,参数);绘图的%,通过序列长度归一化返回损耗。损失=提取数据(丢失)./序列集;结尾
关节ModelEncoder.
は,入力データ,モデルパラメーター,学校习正しい出のにににするのを受け取り受け取り受け取り受け取り受け取り,モデルモデル力とlstmの隠れを返します。
序列更长度
ががの合,この关节が出ませすることはありませ。ModelEncoder.
をを用する结合は,序列更长度
にに空の値値を指定しし
功能[dlZ, hiddenState] = modelEncoder(parametersEncoder, dlX, sequenceLengths)%嵌入。权重= parametersencoder.emb.weights;DLZ =嵌入(DLX,权重,“DataFormat”那'CBT');% LSTM 1。Inputweights = parametersencoder.lstm1.inputpuights;Recurrentweights = parametersencoder.lstm1.recurrentweights;bias = parametersencoder.lstm1.bias;numhidendunits =尺寸(复制重量,2);initialhiddentstate = dlarray(零([numhidridunits 1]));initialcellstate = dlarray(zeros([numhidendunits 1]));dlz = lstm(dlz,initialhiddstate,initialcellstate,输入重量,......经常性重量,偏见,“DataFormat”那'CBT');% LSTM 2。Inputweights = parametersencoder.lstm2.Inputweights;refurrentweights = parametersencoder.lstm2.recurrentweights;bias = parametersencoder.lstm2.bias;[dlz,hiddenstate] = lstm(dlz,initialhiddentstate,initialcellstate,......输入重量,复制重量,偏见,“DataFormat”那'CBT');审视培训%。如果〜isempty(序列)minibatchsize =尺寸(dlz,2);为了n = 1:minibatchsize hymentstate(:,n)= dlz(:,n,sequencelengths(n));结尾结尾结尾
关节modelDecoder
は,入力データ,モデルパラメーター,コンテキストベクトル,LSTMの初期隠れ状態,符号化器の出力,およびドロップアウトの確率を受け取り,復号化器の出力,更新されたコンテキストベクトル,更新されたLSTM状態,およびアテンションスコアを返します。
功能[dly,context,hiddenstate,stentionscores] = modeldecoder(参数doder,dlx,context,......HiddenState,DLZ,辍学)%嵌入。重量= parametersDecoder.emb.Weights;dlX = embed(dlX, weights,“DataFormat”那'CBT');%RNN输入。Sequencelength = size(DLX,3);dly = cat(1,dlx,repmat(上下文,[1 1 sequencelength]));% LSTM 1。Inputweights = parametersdecoder.lstm1.inputpuights;refurrentweights = parametersdecoder.lstm1.recurrentweights;bias = parametersdecoder.lstm1.bias;initialcellstate = dlarray(zeros(zeros(size(hiddenstate)));dly = lstm(dly,hiddenstate,initialcellstate,输入重量,经常性重量,偏见,“DataFormat”那'CBT');% 辍学。mask = (rand(size(dlY)),“喜欢”,dly)>辍学);dly = dly。*面具;% LSTM 2。Inputweights = parametersdecoder.lstm2.inputpuights;refurrentweights = parametersdecoder.lstm2.recurrentweights;bias = parametersdecoder.lstm2.bias;[dly,hiddenstate] = lstm(dly,hiddentate,initialcellstate,输入重量,经常性重量,偏见,“DataFormat”那'CBT');%的注意。权重= parametersdecoder.attn.weights;[诊断核,上下文] =注意(浑浊,DLZ,重量);%连接。dly = cat(1,dly,repmat(上下文,[1 1 sequencelength]));%完全连接。权重= parametersdecoder.fc.weights;bias = parametersdecoder.fc.bias;dly =全协调(dly,重量,偏见,“DataFormat”那'CBT');%softmax。dly = softmax(dly,“DataFormat”那'CBT');结尾
关节注意
は,鲁松の“一道的な”スコアリングに従ったアテンションと,更新されコンテキストコンテキストベクトルますますますますます。各タイムステップにおけるは,隠れ状态およびエネルギーは,隠れ状态および习はなアテンションのと,符と化器材のの力のドット积です。
功能[attentionScores, context] =注意(hiddenState, encoderOutputs, weights)%初始化注意能量。[Minibatchsize,Sequencelength] =大小(EncoderOutputs,2:3);Ippectionenergies = zeros([sequencelength minibatchsize],“喜欢”,乡村人);%注意能量。hwx = hiddenstate。* pagemtimes(重量,ercoderoutputs);为了tt = 1:Sequencelength Imprefernenergies(tt,:) = sum(hwx(:,:,tt),1);结尾%关注分数。actentionscores = softmax(注意力,“DataFormat”那'cb');%的上下文。EncoderOutputs = permute(ercoderoutputs,[1 3 2]);actentionscores =换算(诊断核,[1 3 2]);context = pagemtimes(encoderoutputs,interentionscores);上下文=挤压(上下文);结尾
关节maskedCrossEntropy
.
功能损失= maskedcrossentropy(dly,t,sequencelengs)%初始化丢失。损失= 0;%循环在迷你批处理上。Minibatchsize =尺寸(dly,2);为了idx = 1:sequenceLengths(n);loss = loss + cross - ropy(dlY(:,n,idx), T(:,n,idx),“DataFormat”那'CBT');结尾%标准化。损失=损失/小匹匹匹;结尾
关节Decodermodelprections.
は,入力シーケンス,ターゲットシーケンス,隠れ状態,ドロップアウトの確率,教師強制を有効にするためのフラグ,シーケンス長を所与として,予測されたシーケンスd
を返します。
功能dly = decoder预期(parametersdecoder,dlz,t,hiddenstate,丢弃,......doteacherforcing,sequencelength)%转换为dlarray。dlT = dlarray (T);%初始化上下文。minibatchsize =尺寸(dlt,2);numhidendunits = size(dlz,1);context = zeros([numhidendunits minibatchsize],“喜欢”,dlz);如果doteacherforcing.%通过解码器转发。dly = modeldecoder(parametersdecoder,dlt,context,hiddenstate,dlz,辍学);别的%获取解码器的第一时间步长。DecoderInput = DLT(:,:1);%初始化输出。numclasses = numel(parametersdecoder.fc.bias);dly = zeros([numcrasses minibatchsize sequencelength],“喜欢”,DecoderInput);%循环随时间步骤。为了t = 1: sequenceLength%通过解码器转发。[dlY(:,:,t), context, hiddenState] = modelDecoder(parametersDecoder, decoderInput, context,......HiddenState,DLZ,辍学);%更新解码器输入。[~, decoderInput] = max(dlY(:,:,t),[],1);结尾结尾结尾
关节翻译
は,ミニバッチミニバッチを反复するするによってテキストのの配列を変换ししこのこのはは,モデルモデル,入モデル,入力字符串配列,最大シーケンス,,ミニバッチサイズ,ソースおよびおよび単语単语符,开始トークンおよび停止,出力を集计するための区切り号をを力として受け取ります。
功能strtranslated = translateText(参数,strsource,max sequencelength,minibatchsize,......encSource、encTarget startToken stopToken,分隔符)%变换文本。documentsource = transformtext(strsource,starttoken,stowtoken);sequencessource = doc2sequence(encsource,documentSource,......'paddingdirection'那“对”那......'paddingsvalue',encsource.numwords + 1);%转换为dlarray。X =猫(sequencesSource {:});X = permute(X,[1 3 2]);dlX = dlarray (X);%初始化输出。numObservations =元素个数(你要);strTranslated =字符串(numObservations, 1);%循环在迷你批次。numiterations = ceil(numobservations / minibatchsize);为了i = 1:numIterations idxMiniBatch = (i-1)*miniBatchSize+1:min(i*miniBatchSize, numservations);miniBatchSize =元素个数(idxMiniBatch);%编码使用模型编码器。Sequencelengths = [];[dlz,hiddenstate] = modelencoder(parameters.encoder,dlx(:,idxminibatch,:),sequencelengs);%解码器预测。doteacherforcing = false;辍学= 0;DecoderInput = Repmat(Word2ind(Enctarget,StartToken),[1 minibatchsize]);DecoderInput = DlArray(DecoderInput);dly = decoder预期(参数.decoder,dlz,decoderinput,hiddenstate,丢弃,......doteacherforcing,maxsequencelength);[〜,Idxpred] = Max(提取数据(DLY),[],1);%继续翻译旗帜。idxstop = word2ind(enctarget,stowtoken);keeptranslating = idxpred〜= idxstop;%循环随时间步骤。t = 1;尽管t <= maxsequenceLength &&任何(keeptranslating(:,:,t))%更新输出。新字= Ind2Word(enctarget,Idxpred(:,:,t))';idxupdate = idxminibatch(keeptranslating(:,:,t));strtranslated(idxupdate)= strtranslated(idxupdate)+ delimiter + newwords(keeptranslating(:,:,t));t = t + 1;结尾结尾结尾
adamupdate
|基于分子
|dlarray.
|dlfeval.
|Dlgradient.
|dlupdate.
|LSTM.
|softmax.
|doc2sequence.
(文本分析工具箱)|令人畏缩的鳕文
(文本分析工具箱)|Word2ind.
(文本分析工具箱)|Wordencoding.
(文本分析工具箱)