主要内容

このページの翻訳は最新ではありません。ここをクリックして,英語の最新版を参照してください。

深層学習を使用したテキストの生成

この例では,深層学習長短期記憶(LSTM)ネットワークに学習させてテキストを生成する方法を説明します。

テキスト生成用の深層学習ネットワークに学習させるには,文字のシーケンスにおける次の文字を予測するsequence-to-sequence LSTMネットワークに学習させます。次の文字を予測するネットワークに学習させるには,1タイムステップ分シフトした入力シーケンスを応答として指定します。

文字のシーケンスをLSTMネットワークに入力するには,各学習観測値をベクトル x R D で表される文字のシーケンスに変換します。ここで,Dはボキャブラリに含まれる一意の文字の数です。各ベクトルについて,xが,与えられたボキャブラリ内のインデックスの文字に対応する場合は x 1 であり, j の場合は x j 0 です。

学習データの読み込み

テキストデータをテキストファイルsonnets.txtから抽出します。

文件名=“sonnets.txt”;textData = fileread(文件名);

ソネットは2つの空白文字でインデントされ,2つの改行文字で区切られています。取代を使用してインデントを削除し,分裂を使用してテキストを個別のソネットに分割します。最初の3つの要素のメインタイトルと,各ソネットの前に現れるソネットタイトルを削除します。

textData =取代(textData,”“"");textData = split(textData,[newline newline]); / /输出textData = textData(5:2:结束);

最初のいくつかの観測値を表示します。

textData (1:10)
ans =10×1单元阵列{来自我们所渴望的最美丽的生物,↵因此,美丽的玫瑰也许永远不会凋谢,↵但随着时间的流逝,成熟者也会逐渐成熟,↵他的温柔继承人可能会记住他:↵但是你,与你自己明亮的眼睛签约,↵用自足的燃料喂养你的光之火焰,↵在富足的地方制造饥荒,↵你自己是你的敌人,对你甜蜜的自己太残忍了:↵你现在是世界上最新的装饰,↵也是花哨春天的唯一使者,↵在你自己的花蕾里埋藏着你的内容,↵而娇嫩的小气最浪费:↵可怜这个世界,否则这个贪吃的人,↵吃世界上应得的东西,借着坟墓和你。{当四十个冬天将围困你的额头,↵在你美丽的土地上挖深沟,↵你的青春的骄傲的制服现在如此凝视,↵将是一株破烂的杂草,价值不菲:↵然后被问到,你所有的美在哪里,↵在那里,所有的财富,你的辉煌的日子;↵说,在你深沉的眼睛里,↵都是吃不消的羞耻和吝啬的赞美。↵你的美貌更值得赞美,↵如果你能回答“我这个漂亮的孩子↵我要算算我的总数,并提出我以前的借口,'↵用你的继承证明他的美丽!↵当你年老时,这将是新的,↵当你觉得冷的时候,看看你的血液是暖的。{看着你的杯子,告诉你看到的脸↵现在是时候让脸变成另一张了;↵如果你现在不更新,谁的新修复,↵你欺骗了整个世界,不伤害一些母亲。↵因为她未出生的子宫在哪里如此美丽↵鄙视你的耕作?↵或者他这么喜欢谁会是坟墓,↵他的自爱阻止了后代?↵你是你母亲的镜子,她在你里面↵回忆起她青春的四月;↵所以你将透过你这个年龄的窗户看到,↵尽管有皱纹,这是你的黄金时代。↵但如果你活着,请记住你不应该,↵孤独地死去,你的形象也跟着你一起死去。{}不快的可爱,你为什么要花费↵在你自己身上,你美丽的遗产?↵大自然的遗赠什么也不给,但会借给你什么,↵坦率地说,她借给那些免费的人:↵那么,漂亮的小气鬼,你为什么辱骂我↵给你的慷慨的施舍?↵无利可图的高利贷者,你为什么用↵这么多钱,却不能活下去?↵因为你独自一人与自己来往,↵你的自我,你甜蜜的自我欺骗了你:↵那么,当大自然召唤你离开时,↵你还能留下什么?↵你未用过的美丽必须与你相伴,↵过去,它是“未来的执行者”。{{那些时间,用温和的工作做的框架↵每一只眼睛都驻足的可爱的凝视,↵也会对暴君一视同仁↵以及那些公平地胜出的不公平;↵因为永不休息的时间引领着夏天↵到了可怕的冬天,把他弄糊涂了;↵树液被霜封住了,有光泽的叶子完全消失了,↵到处都是美丽的雪和赤裸:↵那么夏天的蒸馏不就剩下了吗?,↵一个被囚禁在玻璃墙上的液体囚犯,↵美对美的影响被剥夺了,↵没有它,也不记得它是什么:↵但是花会蒸馏,尽管它们与冬天相遇,↵但是他们的表演,他们的物质仍然是甜蜜的。{那么,不要让冬天粗糙的手玷污,↵在你的夏天里,在你被蒸馏之前:↵做一些甜蜜的小瓶,珍惜一些地方↵在美自我毁灭之前,用美的宝藏。↵这种用途并不是禁止高利贷,↵这使那些愿意支付贷款的人感到高兴;↵那是为了你自己去培育另一个你,↵或者十倍的幸福,一人十倍;↵十倍于你自己的幸福,↵如果你的十次中有十次再给你祈祷:↵那么,如果你离开,死亡又能做什么呢,↵让你活在子孙后代?↵不要妄自尊大,因为你太美了↵成为死亡的征服者,让虫子成为你的继承人。{瞧!在东方,当仁慈的光↵抬起他燃烧的头,每个人都在眼睛下面↵向他新出现的景象致敬,↵神气活现地侍奉着神圣的陛下;↵爬上了陡峭的天山,↵像他中年时强壮的青年,↵然而凡人的外表仍然崇拜他的美丽,↵参加他的黄金朝圣:↵但当从最高的音高,带着疲惫的汽车,↵他像衰弱的年纪,从白昼就摇摇晃晃,↵眼睛,“以前是忠实的,现在是转变的。”↵从他的下半身,换个角度看:↵因此,你自己在中午离开:↵除非你有个儿子,否则你就死定了。{听音乐,你为什么要悲伤地听音乐?↵甜言蜜语不打仗,欢乐以欢乐为乐:↵你为什么爱你不乐意接受的东西,↵否则你会高兴地接受你的烦恼吗?↵如果真正和谐的和谐的调好的声音,↵结婚,一定要冒犯你的耳朵,↵他们只是甜言蜜语地责骂你,谁使你困惑↵在单身中,你应该承担的部分。↵标记一根绳子,甜蜜的丈夫对另一根,↵通过相互排序在每一个中敲打;↵像父子和快乐的母亲,↵谁能在一个悦耳的音符中歌唱:↵他的无言之歌很多,似乎只有一首,↵唱这首歌给你听:'你单身一人将一无所获。}{'是因为害怕弄湿寡妇的眼睛,↵你会thy self in single life?↵Ah! if thou issueless shalt hap to die,↵The world will wail thee like a makeless wife;↵The world will be thy widow and still weep↵That thou no form of thee hast left behind,↵When every private widow well may keep↵By children's eyes, her husband's shape in mind:↵Look! what an unthrift in the world doth spend↵Shifts but his place, for still the world enjoys it;↵But beauty's waste hath in the world an end,↵And kept unused the user so destroys it.↵No love toward others in that bosom sits↵That on himself such murd'rous shame commits.' } {'For shame! deny that thou bear'st love to any,↵Who for thy self art so unprovident.↵Grant, if thou wilt, thou art belov'd of many,↵But that thou none lov'st is most evident:↵For thou art so possess'd with murderous hate,↵That 'gainst thy self thou stick'st not to conspire,↵Seeking that beauteous roof to ruinate↵Which to repair should be thy chief desire.↵O! change thy thought, that I may change my mind:↵Shall hate be fairer lodg'd than gentle love?↵Be, as thy presence is, gracious and kind,↵Or to thyself at least kind-hearted prove:↵Make thee another self for love of me,↵That beauty still may live in thine or thee.' }

テキストデータのシーケンスへの変換

テキストデータを予測子用のベクトルのシーケンスと応答用のカテゴリカルシーケンスに変換します。

“テキスト開始”、“空白”、“テキスト終結”,および”改行“を表す特殊文字を作成します。特殊文字“\ x0002”(テキスト開始),“\ x00B7”(“·”,中黒),“\ x2403”(“␃”,テキスト終結),および“\ x00B6”("”段落記号)をそれぞれ使用します。あいまいさを避けるために,テキストに現れない特殊文字を選択しなければなりません。これらの文字は学習データに現れないため,この目的に使用できます。

startOfTextCharacter =组成(“\ x0002”);whitespaceCharacter =组成(“\ x00B7”);endOfTextCharacter =组成(“\ x2403”);newlineCharacter =组成(“\ x00B6”);

各観測値について,先頭にテキスト開始文字を挿入し,空白と改行を対応する文字に置き換えます。

textData = startOfTextCharacter + textData;textData =取代(textData, (”“换行符]、[whitespaceCharacter newlineCharacter]);

テキスト内の一意の文字から成るボキャブラリを作成します。

uniqueCharacters =独特([textData {:}));numUniqueCharacters =元素个数(uniqueCharacters);

テキストデータについてループし,各観測値の文字を表すベクトルのシーケンスと応答用の文字のカテゴリカルシーケンスを作成します。各観測値の終わりを表すために,テキスト終結文字を含めます。

numDocuments =元素个数(textData);XTrain =细胞(1、numDocuments);YTrain =细胞(1、numDocuments);i = 1:numel(textData)字符= textData{i};sequenceLength =元素个数(字符);获取字符的索引。[~, idx] = ismember(字符,uniqueCharacters);%将字符转换为向量。X = 0 (numUniqueCharacters sequenceLength);j = 1:sequenceLength X(idx(j),j) = 1;结束%创建带有文本结束字符的分类响应向量。charactersshift = [cellstr(字符(2:结束)')' endOfTextCharacter];Y =分类(charactersShifted);XTrain{我}= X;YTrain{我}= Y;结束

最初の観測値と,対応するシーケンスのサイズを表示します。シーケンスはD年代列の行列です。Dは特徴の数(一意の文字の数),年代はシーケンス長(テキストの文字数)です。

textData {1}
ans =从·的····欲望增加,生物¶从而··的·罗斯··美从未·死,¶但是···成熟····时间应该死,¶招标·他···贝尔·他·记忆:继承人¶但你·····你自己的收缩··明亮的眼睛,¶喂花光你···火焰··定情·燃料,¶饥荒使·····丰度所在,¶你的自我···敌人,···你甜蜜自我···cruel:¶现在艺术你·····的·新鲜·点缀,¶和··先驱···华丽·春,¶你··的·巴德·内埋葬你··内容,¶而·温柔·吝啬·花···吝啬鬼:浪费¶遗憾··世界,·或者其他····是贪食,¶世界····吃的,由·····你。”
大小(XTrain {1})
ans =1×262 611

対応する応答シーケンスを表示します。このシーケンスは,応答から成る1行年代列の直言ベクトルです。

YTrain {1}
ans =1×611分类数组F r o m·F i r e s t·c r e t u r e s w·e·d e s i r e·e n c r e s,¶t h t·h e r e b y·b e u t y ' s·r o s e·m i g h t·n e v e r·d e,¶b u t·s·t h e·r i p e r·s h o u l d b·y·t i m e·d e c e s e,¶h i s·t e n d e r·h e我g h t·r·m b e r·h i s·m e m o r y:¶B u t·h o·c o n t r c t e d·o·t h i n e·o w n·B r i g h t·e y e s,¶F e e d ' s t·t h y·l g h t ' s·F l m e·w i t h·s e l F - s u B s t n t i l·F u e l,¶m k我n g·a·F m n e·w h e r e·B u n d n c e·l i e s,¶t h y y s e l F·t·h·F e阿,·t·t h·s w e e t·s e l f·t o·c r u e l:¶T h o u·T h T·r T·n o w T h·e·w o r l d ' s·f r e s h·o r n a T m e n,¶n d·o n l y·h e r l e d T o·T·h·g d u y·s p r i n g,¶w我T h n·T h n e·o w·b d·b u r i e s T T h·y·c o n T e n T,¶n d·T e n c d e r·h u r l·m k’s T·w s T e·n·n我g g r d i n g:¶P i t y·t h e·w o r l d·o r s e·t·e l h i s·g l u t t o n·b e,¶t o·e·t h e·w o r l d ' s·d u e、b·y·t h e·g r n v e·d·t h e e。␃

LSTMネットワークの作成と学習

LSTMアーキテクチャを定義します。200年隠れユニットが個のsequence-to-sequence LSTM分類ネットワークを指定します。学習データの特徴次元(一意の文字の数)を入力サイズとして,応答に含まれるカテゴリの数を全結合層の出力サイズとして設定します。

inputSize =大小(XTrain {1}, 1);numHiddenUnits = 200;numClasses =元素个数(类别([YTrain {:})));layer = [sequenceInputLayer(inputSize) lstmLayer(numHiddenUnits,“OutputMode”“序列”) fulllyconnectedlayer (numClasses) softmaxLayer classificationLayer;

関数trainingOptionsを使用して学習オプションを指定します。学習エポックの回数を500に初期学習率0.01をに指定します。勾配の発散を防ぐために,勾配のしきい値を2に設定します。“洗牌”オプションを“every-epoch”に設定して,エポックごとにデータをシャッフルするように指定します。学習の進行状況を監視するには,“阴谋”オプションを“训练进步”に設定します。詳細出力を表示しないようにするには,“详细”に設定します。

ミニバッチサイズオプションは,1回の反復で処理する観測値の数を指定します。関数が学習のすべての観測値を確実に使用するように、データを均等に分割するミニバッチ サイズを指定します。そうでない場合、関数はミニバッチに収まっていない観測値を無視します。ミニバッチのサイズを 77 に設定します。

选择= trainingOptions (“亚当”...“MaxEpochs”, 500,...“InitialLearnRate”, 0.01,...“GradientThreshold”2,...“MiniBatchSize”, 77,...“洗牌”“every-epoch”...“阴谋”“训练进步”...“详细”、假);

ネットワークに学習をさせます。

网= trainNetwork (XTrain、YTrain层,选择);

新しいテキストの生成

例の最後にリストされている関数generateTextを使用し,学習済みネットワークを使用してテキストを生成します。

関数generateTextは,テキスト開始文字から始めて1文字ずつテキストを生成し,特殊文字を使用してテキストを再構成します。この関数は,出力予測スコアを使用して各文字をサンプリングします。ネットワークがテキスト終結文字を予測するか,生成されたテキストの長さが500文字になると,関数が予測を停止します。

学習済みネットワークを使用してテキストを生成します。

generatedText = generateText(网,uniqueCharacters, startOfTextCharacter、newlineCharacter whitespaceCharacter, endOfTextCharacter)
看,你的麻风男们,他们为你的可爱而骄傲。死神来了,她的心都碎了,她的心都碎了,她的心都碎了,她的心都碎了,她的心都碎了。每一幅画都可以用这种恰当的配色,用温柔的石灰,用奇异的姿色,日日夜夜,你把它糟蹋得焕然一新;因为我的心已经耗尽了我的血管

テキスト生成関数

関数generateTextは,テキスト開始文字から始めて1文字ずつテキストを生成し,特殊文字を使用してテキストを再構成します。この関数は,出力予測スコアを使用して各文字をサンプリングします。ネットワークがテキスト終結文字を予測するか,生成されたテキストの長さが500文字になると,関数が予測を停止します。

函数generatedText = generateText(网,uniqueCharacters, startOfTextCharacter、newlineCharacter whitespaceCharacter, endOfTextCharacter)

テキスト開始文字のインデックスを見つけて,そのベクトルを作成します。

numUniqueCharacters =元素个数(uniqueCharacters);X = 0 (numUniqueCharacters, 1);idx = strfind (uniqueCharacters startOfTextCharacter);X (idx) = 1;

predictAndUpdateStateおよびdatasampleを使用し,学習済みLSTMネットワークを使用して1文字ずつテキストを生成します。ネットワークがテキスト終結文字を予測するか,生成されたテキストの長さが500文字になったら予測を停止します。関数datasampleには、统计和机器学习工具箱™が必要です。

データの大規模なコレクション,長いシーケンス,または大規模ネットワークの場合は,通常,GPUでの予測の方がCPUでの予測より計算時間が短縮されます。そうでない場合,通常,CPUでの予測の計算の方が高速です。1タイムステップの予測には,CPUを使用します。予測にCPUを使用するには,predictAndUpdateState“ExecutionEnvironment”オプションを“cpu”に設定します。

generatedText ="";词汇=字符串(net.Layers(结束). class);最大长度= 500;strlength (generatedText) <最大长度预测下一个角色得分。[净,characterScores] = predictAndUpdateState(净,X,“ExecutionEnvironment”“cpu”);%采样下一个字符。newCharacter = datasample(词汇,1,“重量”, characterScores);停止预测文本的结尾。如果newCharacter = = endOfTextCharacter打破结束将字符添加到生成的文本中。generatedText = generatedText + newCharacter;为下一个输入创建一个新的向量。X (,) = 0;idx = strfind (uniqueCharacters newCharacter);X (idx) = 1;结束

特殊文字を対応する空白文字や改行文字に置き換えて,生成されたテキストを再構成します。

generatedText = replace(generatedText,[newlincharacter whitespaccharacter],[newline . txt],[newline . txt]”“]);结束

参考

|||

関連するトピック