ここ数週間、私は PyTorch で char-rnn のバージョンを実装することに多くの時間を費やしてきました。これまでニューラル ネットワークをトレーニングしたことがないので、ここから始めるのが面白いかもしれません。 このアイデア (The Unreasonable Effects of RNNs より) を使用すると、文字ベースのリカレント ニューラル ネットワーク (RNN) をテキストでトレーニングし、驚くほど優れた結果を得ることができます。
しかし、望んでいた結果は得られなかったものの、PyTorch と RNN の実験を始めようとしている他の人たちに役立つことを願って、いくつかのサンプル コードと結果を共有したいと思いました。 以下は Jupyter ノートブック形式のコードです: PyTorch.ipynb の char-rnn 。この Web ページの上部にある [Colab で開く] ボタンをクリックすると、Google の Colab サービスで開き、トレーニングに無料の GPU を使用できます。全部で約 75 行のコードですが、このブログ投稿でできる限り詳しく説明します。 ステップ1: データを準備する まず、データをダウンロードする必要があります。私はプロジェクト・グーテンベルクのハンス・クリスチャン・アンデルセン童話のデータを使用しました。
これはデータを準備するためのコードです。データ処理には fastai ライブラリの Vocab クラスを使用しました。このクラスは、一連の文字を「語彙」に変換し、この「語彙」を使用して文字を数字に変換します。 次に、モデルのトレーニングに使用できる大きな数値配列 ( training_set ) を作成します。
ステップ2: モデルを定義する これは、PyTorch の LSTM クラスのラッパーです。 LSTM クラスをカプセル化するだけでなく、次の 3 つのことを行います。
このコードも魔法のようなことを行いますが、それほど明白ではありません。入力が 6 つの文字に対応するベクトル (例: [1,2,3,4,5,6]) である場合、nn.LSTM は時間の経過に伴うバックプロパゲーションを使用して内部的に隠しベクトルを 6 回更新するというのが私の理解です。 ステップ3: トレーニングコードを書く モデルは自動的にトレーニングされません。 最初は fastai ライブラリ (PyTorch のラッパーでもある) のヘルパー クラスを使用してみました。何をしているのか全くわからなかったので少し混乱しましたが、結局モデルのトレーニング コードを自分で書くことになりました。 以下のコード (epoch() メソッド) は、1 ラウンドのトレーニング プロセスに関する基本情報です。基本的には、以下のことを繰り返します。
nn.LSTMを使用して時間経過に沿ってバックプロパゲートし、独自のコードを書かないでください。 まず、次のように、一度に 1 文字ずつ LSTM レイヤーに渡し、定期的に導関数を計算する独自のコードを書きました。
このコードは 20 文字を 1 文字ずつ渡し、最後に 1 回トレーニングします。このステップは時間によるバックプロパゲーションと呼ばれ、Karpathy がブログ記事で使用しているものです。 この方法は、ある程度は役に立ちます。私が書いた損失関数は、最初はしばらく減少しますが、その後ピークに達します。なぜこのようなことが起こったのかは分かりませんが、LSTM に 20 文字ずつ (seq_len 次元に応じて) 渡してバックプロパゲーションするように変更したところ、状況は改善しました。 ステップ 4: モデルをトレーニングします。 モデルが英語のようなテキストを出力し始めるまで、同じデータに対してこのトレーニング コードを約 300 回繰り返しました。約1時間かかりました。 この場合、モデルが過剰適合しているかどうかは気にしませんが、実際のシナリオでモデルをトレーニングする場合は、検証セットでモデルを検証する必要があります。 ステップ 5: 出力を生成します。 最後に、このモデルを使用して出力を生成します。このトレーニング済みモデルからテキストを生成するヘルパー メソッド (make_preds と next_pred) を作成しました。ここで重要なのは、ベクトルの次元を揃えることです。重要な点は次のとおりです。
基本的に私たちが行うことは次のとおりです。
処理するテキストの長さが 300 の場合、このプロセスを 300 回繰り返すだけで済みます。 結果! 予測関数のパラメータを温度 = 1 に設定し、モデルによって次の結果が生成されました。これは英語に少し似ていますが、モデルが英語を最初から「学習」し、文字シーケンスのレベルで学習していることを考えると、かなり良い結果です。 これらの単語には意味がありませんが、どのような出力が欲しいのかわかりません。
以下の結果は、temperature=0.1 の場合に生成されます。これは、「毎回最も高い確率の文字を選択する」方法に近い方法で文字を選択します。その結果、出力に多くの重複が生じます。
この出力には、甲虫、菓子職人、太陽、海という単語に対する奇妙な執着があります。 まとめます! これまでのところ、私の結果は Karpathy ほど良くありませんが、おそらくいくつかの理由があります。
しかし、概ね合格点の結果が出ました! 悪くないですね! |
<<: 人工知能はどれくらい怖いのでしょうか?アメリカはAI兵器を開発し、イランの科学者は死亡した
>>: 無料の Python 機械学習コース 1: 線形回帰アルゴリズム
仮想化技術はコンピューティング分野で幅広い用途があり、ハードウェア リソースの利用率を向上させ、メン...
[[412579]] 2016 年には、財務報告書に基づいてプレスリリースを書くという、人間と機械に...
近年、顔認識をめぐる論争が絶えません。少し前に、「初の顔認識事件」の第一審判決が発表され、杭州野生動...
人工知能 (AI) と機械学習 (ML) のテクノロジーは、サイバーセキュリティを含め、今や私たちの...
研究者たちは、機械学習の手法を使用して、高次元の非線形データから直接最も価値があり重要な内部法則を自...
Google は最近、TensorFlow Quantum (TensorFlow の拡張) のオー...
運用の卓越性は、ビジネスの回復力と収益の成長を向上させる鍵となりますが、今日のプロセス所有者は、急速...
金融業界は国民経済の生命線です。モバイルインターネットやオンライン決済の普及により、データは企業にと...
Marzyeh Ghassemi 助教授は、医療データに隠れたバイアスが人工知能のアプローチにどのよ...
[[326611]] 「新型コロナウイルスにさらされると、マスクが自動的に点灯し、検査員に警告を発し...