詳細なメモプレゼンテーションに基づいてSeq2Seq PyTorchの翻訳モデル(A)

免責事項:この記事はブロガーオリジナル記事です、BY-SAの著作権契約、複製、元のソースのリンクと、この文を添付してくださいCC 4.0に従ってください。
このリンク:HTTPS://blog.csdn.net/qysh123/article/details/91245246
Seq2Seqは深い学習、翻訳、自然言語での翻訳、知識と良い結果であっても、クロスモーダルマッピング側面の主流モデルです。ソフトウェア工学では、近年では広く例えば、使用されています:

江、思源、アミールArmaly、およびコリンマクミラン。「自動的に神経の機械翻訳を使用して差分からコミットメッセージを生成します。」自動化ソフトウェア工学、頁135-146で第32回IEEE / ACM国際会議の議事録。IEEEプレス、2017。

胡、興、Geの李、新夏、デビッド・ロー、そして志ジン。「ディープ・コードのコメント世代。」プログラム理解、頁200-210上の第26回会議の議事録。ACM、2018。

ここで私は簡単にするとき、このモデルの実装とPyTorch対応するAPIの詳細を要約するSeq2Seqを与えられたサンプルコードPyTorchを組み合わせます。そこにそのウェブサイトのチュートリアルにPyTorchます。https:GitHubのリンクに対応//pytorch.org/tutorials/intermediate/seq2seq_translation_tutorial.htmlは、次のとおりです。https://github.com/pytorch/tutorials/blob/master/intermediate_source/seq2seq_translation_tutorial .py。ここでは、このコード例には、要約します:

ます。https:公式サイトのリンクをダウンロードするには、上記のリンクで対応するデータを提供します//download.pytorch.org/tutorial/data.zipは、加えて、実際には、オンラインチュートリアルの多くは、チュートリアルの公式翻訳の上にもあり、私は:を含むいくつかの参照、

https://www.cnblogs.com/HolyShine/p/9850822.html

https://www.cnblogs.com/www-caiyin-com/p/10123346.html

http://www.pianshen.com/article/5376154542/

だから我々は、私はいくつかの追加を行い、その根拠を説明し、これらのチュートリアルの基礎となり得る、それはチュートリアルセッション、上記のように十分な説明を与えるものではありませんが、私はいくつかの重要な要素をまとめたものだと思います。まず、これらは総括していない、我々は理解の上で、既存のチュートリアルを見てエンコードする初期化します。開始エンコーダからの要約:

EncoderRNNクラス(nn.Module):
DEF __init __(自己、input_size、hidden_​​size):
スーパー(EncoderRNN、セルフ).__プロパティの初期化__()#親クラスが初期化されるから継承されます。
= hidden_​​size self.hidden_​​size

self.embedding = nn.Embedding(input_size、hidden_​​size)#入力は、最初の埋め込みを行います。
入力シーケンスをRNNため= nn.GRUのself.gru(hidden_​​size、hidden_​​size)#Applies A多層GateDの再発ユニット(GRU)。

DEFフォワード(セルフ、INPUT、隠された)
。組込みself.embedding =(INPUT).view(1実際テンソル変換方法を、既存の、1、-1)#view。
埋め込み=出力
の出力、self.gru隠さ=(出力、隠された)
戻り出力、隠れ

DEF initHidden(自己):
戻りtorch.zeros(1 ,. 1、self.hidden_​​size、デバイス=デバイス)#初期発生(1,1,256 )全てゼロ次元テンソル。
わずか数行が、いくつかはまだ議論が必要な場合があります。nn.Embedding初期埋め込みを、当然のことながら、この埋め込みがないトレーニングや実用的な意味で、完全にランダムです、私はオンラインでもいくつかの記事だと思いますHTTPS:具体的にここでの議論を参照して、明確な(//my.oschina.net/earnp/blog/1113896:HTTPS例えばエラーがここで説明されていない)を//blog.csdn.net/qq_36097393/article /詳細/ 88567942。そのパラメータの意味は、この説明を参照することができます。あなたが千個の言葉をそれぞれ持っているかのように、2つの単語があるnn.Embedding(2、5)は、2を表し、5次元の5を、実際には、2x5の行列であり、 100ワードの希望は、あなたが、nn.Embedding(1000年、100)を埋め込むなどの単語を構築することができ、その次元です。私は要約の下に、あなたはまた、サンプルコードを実行することができます:

トーチインポート
インポートtorch.nn AS NNの

word_to_ix = { 'ハロー' 0 '世界:. 1}
nn.Embedding =(2,5)を埋め込み
hello_idx torch.LongTensor =([word_to_ix [ 'ハロー']])
world_idx = torch.LongTensor([word_to_ix [ '世界']])
hello_embed =埋め込みを(hello_idx)
印刷(hello_embed)は
world_embed =埋め込みを(world_idx)
印刷(world_embed)
我々が一目で確認、私は信じている特定の意味、あなたはそれを実行しようとすることができます(毎回印刷結果は同じではありません、とも)実用的な意味合いを欠いています。

他は.view(1、1、-1)の意味、私は実際には、stackoverflowの上の誰かがすでにこの問題を議論し、前に理解していなかった正直に言うと次のとおりです。

https://stackoverflow.com/questions/42479902/how-does-the-view-method-work-in-pytorch

私たちは、私は上記の例は、他のいくつかを提供し、ここで持っている、知って見て:

トーチインポート
torch.range =(1、16)
印刷(A)
A = a.view(4 ,. 4)
印刷(A)
エンコーダは、単にこれらをまとめたものです。直接注意機構を備えたデコーダに以下の要約は、(理解を助けるために、テンソルのすべてのステップは、私は個人的に理解しやすいようすることができると思う緯度を示すいくつかのメモを追加した後):

クラスAttnDecoderRNN(nn.Module):
デフ__init __(自己、hidden_​​size、output_size、dropout_p = 0.1、MAX_LENGTH = MAX_LENGTH):#MAX_LENGTH在翻译任务中定义为10
超(AttnDecoderRNN、自己).__ INIT __()
self.hidden_​​size = hidden_​​size
self.output_size = output_size#这里的output_size是output_lang.n_words
self.dropout_p = dropout_p#ドロップアウト的比例。
self.max_length = MAX_LENGTH

self.embedding = nn.Embedding(self.output_size、self.hidden_​​size)
self.attn = NN。線形(self.hidden_​​size * 2、self.max_length)
self.attn_combine = nn.Linear(self.hidden_​​size * 2、self.hidden_​​size)#按照维度要求、进行线性变换。
self.dropout = nn.Dropout(self.dropout_p )
self.gru = nn.GRU(self.hidden_​​size、self.hidden_​​size)
self.out = nn.Linear(self.hidden_​​size、self.output_size)

DEFフォワード(自己、入力、隠れ、encoder_outputs):

プリント(入力)
プリント( '入力のサイズ:' + STR(input.size()))
印刷( 'self.embeddingのサイズ(入力): '+ STR(self.embedding(入力).size()))

= self.embedding(入力).view(1、1、-1)埋め込み
プリント('サイズ'+ STR(embedded.size())):【化の

埋め込み= self.dropout(埋め込まれた)
プリント('埋め込み[0]のサイズ: '+ STR(埋め込み[0] .size()))
プリント('サイズtorch.catの((埋め込み[0]は、隠された[0])、1)「+ STR(torch.cat((埋め込み[0]は、隠された[0])、1).size()))
プリント( 'self.attnのサイズ(torch.cat((埋め込み[0]は、隠された[0])、1)):' + STR(self.attn(torch.cat((埋め込み[0]は、隠された[0]) 、1))。サイズ()))

埋め込みの#Size:[1,1,256]
組み込み#sizeの[0]:[1256]
torch.catの大きさの#size((組み込み[0]、隠された[0]),. 1):[1512]

は、ここで注意同等の重みを学んだ
#をトーチは、第二のスプライシング緯度に、つまり、コードの文言によれば、既存の寸法のファンクションtorch.cat、スプライシングを連結することであることに留意されたいです。
#スタックは新たな次元に構築され、次いで緯度にスプライスされます。
= F.softmaxのattn_weights(
self.attn(torch.cat((埋め込み[0]は、隠された[0]),. 1))=薄暗い。1)#はF.softmax torch.nn.functional.softmaxを表します

#sizeのattn_weights:[1,10]
attn_weights.unsqueezeの#size(0):[1,1,10]
encoder_outputsの#size:[10256]
encoder_outputs.unsqueezeの#size(0):[1,10,256]

#unsqueeze説明返し持つ新しい新しいテンソルAは一つは指定された位置のサイズを挿入した。寸法で
attn_applied = torch.bmm(attn_weights.unsqueeze(0)、
encoder_outputs.unsqueeze(0))#BMM本质上来讲是个批量的矩阵乘操作

attn_appliedの#Size:[1,1,256]
出力= torch.cat((埋め込み[0]、[0] attn_applied)、1)
ここで出力の大きさがある:[1512]
プリント( 'この位置での出力の大きさ()' + STR(output.size()))
出力= self.attn_combine(出力).unsqueeze(0)
出力の#Sizeここ[1,1,256]である
#print(出力)
出力= F.relu(出力)は、要素ごとの線形単位機能を#rectified:
#print(出力)
出力、隠れ= self.gru(出力、隠された)
出力= F.をlog_softmax(self.out(出力[0])、DIM = 1)
プリント( '')
印刷( '------------')
リターン出力、隠れ、attn_weights

initHidden(自己)DEF。
torch.zeros(1、1、self.hidden_​​size返し 、デバイス=デバイス)
まず、ドロップアウトは、ドロップアウトが最初PyTorch公式の説明に見てみることができました:

https://pytorch.org/docs/stable/nn.html?highlight=nn%20dropout#torch.nn.Dropout

単にランダムにベルヌーイ分布からのサンプルを使用して確率pで入力テンソルの要素のいくつかをゼロ、トレーニング中に、入れて、友人は非常に詳細な議論や説明を与えます:

https://blog.csdn.net/stdcoutzyx/article/details/49022443

第二に、それは意味と役割についてnn.Linearを指摘し、または説明の公式ウェブサイトを提供する必要があります:受信データへの線形変換を適用し、同様に、私は、下記のサンプルコードを参照することができます。

トーチインポート
インポートtorch.nn AS NNの
mは= nn.Linear(2 ,. 3)
INPUT = torch.randn(2、2)
印刷(INPUT)
出力= M(INPUT)
を印刷(出力)
次に、説明torch.bmm。PyTorch公式サイト、HTTPSを説明するためによると://pytorch.org/docs/stable/torch.htmlハイライトを=トーチ% 20bmm#torch.bmm?

役割があるtorch.bmm:batch1とBATCH2に保存されている行列のバッチ行列 - 行列積を行い、この説明はあまりにも抽象的で、実際には、非常に良い例でそれを理解することは実際にはバルクマトリックス乗算であります:

トーチインポート
BATCH1 torch.randn =(2,3,4)
プリント(BATCH1)
BATCH2 torch.randn =(2,4,5)
プリント(BATCH2)
RES = torch.bmm(BATCH1、BATCH2)
プリント(RES)
特定乗算ルールは:batch1は(×Bである場合 、M×N)テンソル、BATCH2は、(P×M×b)のテンソルであり、アウト(P×N×B)テンソルであろう。

torch.catについて、または公式ウェブサイトに簡単な説明を行うためにPyTorchの例を示します:

指定した次元で配列テンソルの所定の配列を連結します。例子如下:

トーチインポート
X = torch.randn(2,3)
プリント(X)
プリント(torch.cat((X、X、X)、0))
プリント(torch.cat((X、X、X),. 1))
ここでの最初の我々は次の中でブログを総括していきます、ここにまとめます。
----------------
免責事項:この記事はCSDNブロガー元の記事「クリケットクリケット」であり、BY-SAの再現著作権契約、CC 4.0に従って、元のソースと、このリンクを添付してください声明。
オリジナルリンクします。https://blog.csdn.net/qysh123/article/details/91245246

おすすめ

転載: www.cnblogs.com/jfdwd/p/11454585.html