こんにちは、私は Python と NLP の初心者です。パーセプトロン分類器を実装する必要があります。いくつかのウェブサイトを検索しましたが、十分な情報が見つかりませんでした。今のところ、カテゴリ (スポーツ、エンターテイメントなど) ごとにグループ化したドキュメントがいくつかあります。また、これらのドキュメントで最も使用されている単語とその頻度のリストもあります。特定の Web サイトで、引数 x と w を受け入れる何らかの決定関数が必要であると述べられていました。x は明らかにある種のベクトルです (w が何かはわかりません)。しかし、パーセプトロン アルゴリズムを構築するために必要な情報を使用する方法と、それを使用してドキュメントを分類する方法がわかりません。何かアイデアはありますか?ありがとう :)
5 に答える
パーセプトロンはどのように見えるか
外部から見ると、パーセプトロンはn
引数 (つまり次元ベクトル) を取り、出力 (つまりn
次元ベクトル) を生成する関数です。m
m
内部では、パーセプトロンはニューロンの層で構成され、層内の各ニューロンは前の層のすべてのニューロンから入力を受け取り、その入力を使用して単一の出力を計算します。最初の層はn
ニューロンで構成され、入力を受け取ります。最後の層はm
ニューロンで構成され、パーセプトロンが入力の処理を終了した後に出力を保持します。
インプットからアウトプットを計算する方法
i
ニューロンからニューロンへの各接続にj
は重み w(i,j)
があります (それらがどこから来るのかは後で説明します)。2 番目の層のtotal input
ニューロンp
の は、最初の層からのニューロンの重み付けされた出力の合計です。そう
total_input(p) = Σ(output(k) * w(k,p))
wherek
は、最初の層のすべてのニューロンに適用されます。ニューロンの活性化は、活性化関数を適用することにより、ニューロンの総入力から計算されます。よく使われる活性化関数はフェルミ関数なので、
activation(p) = 1/(1-exp(-total_input(p))).
ニューロンの出力は、 を適用することにより、ニューロンの活性化から計算されoutput function
ます。よく使用される出力関数は ID ですf(x) = x
(実際、一部の作成者は出力関数を活性化関数の一部と見なしています)。私はちょうどそれを仮定します
output(p) = activation(p)
第 2 層のすべてのニューロンの出力が計算されたら、その出力を使用して第 3 層の出力を計算します。出力層に到達するまで繰り返します。
重みはどこから来るのか
最初に重みがランダムに選択されます。次に、いくつかの例を選択します (目的の出力がわかっているものから)。各例をパーセプトロンにフィードし、エラーを計算します。つまり、目的の出力から実際の出力がどれだけ離れているかを計算します。その誤差を使用して重みを更新します。新しい重みを計算する最速のアルゴリズムの 1 つは、Resilient Propagationです。
パーセプトロンの構築方法
対処する必要があるいくつかの質問は次のとおりです。
- ドキュメントの関連する特徴は何ですか?また、どのようにそれらを
n
次元ベクトルにエンコードできますか? - 重みを調整するには、どの例を選択する必要がありますか?
- ドキュメントを分類するために、出力をどのように解釈する必要がありますか? 例: 各クラスに確率を割り当てるベクトルに対して、最も可能性の高いクラスを生成する単一の出力。
- 必要な隠れ層の数とその大きさは?
n
ニューロンを含む 1 つの隠れ層から始めることをお勧めします。
1 番目と 2 番目のポイントは、分類器の品質にとって非常に重要です。パーセプトロンは例を正しく分類するかもしれませんが、新しいドキュメントでは失敗します。おそらく実験する必要があります。分類子の品質を判断するには、2 セットの例を選択します。1 つはトレーニング用、もう 1 つは検証用です。残念ながら、実際の経験が不足しているため、これらの質問に回答するための詳細なヒントを提供することはできません.
どちらにも慣れていない場合に、ニューラル ネットワークを使用して NLP の問題を解決しようとするのは、行き過ぎかもしれません。あなたが新しい言語でそれをやっているということは、あなたの心配のほとんどではありません.
私の大学で教えられている神経計算モジュールのスライドにリンクします。セッション 1 とセッション 2 のスライドは第 2 週に必要になります。ページの一番下に、C でニューラル ネットワークを実装する方法へのリンクがあります。いくつかの変更を加えれば、Python に移植できるはずです。多層パーセプトロンの実装方法が詳しく説明されていることに注意してください。単一層のパーセプトロンを実装するだけでよいので、隠れ層に関する記述は無視してください。
x
との簡単な説明w
。x と w は両方ともベクトルです。x は入力ベクトルです。x
関心のある各単語の正規化された頻度が含まれています。w
関心のある各単語の重みが含まれています。パーセプトロンは、各単語の入力頻度にそれぞれの重みを掛けて合計することで機能します。結果を 0 ~ 1 の値に変換する関数 (通常はシグモイド関数) に渡します。入力は実際にはそのクラスの例ではありません。
NLP では、通常、最初にバッグ オブ ワード モデルについて学習してから、他のより複雑なモデルに進みます。ニューラル ネットワークを使用して、うまくいけば、独自のモデルを学習します。これに関する問題は、ニューラル ネットワークでは NLP の理解があまり得られないことです。ドキュメントは含まれる単語によって分類され、通常、ドキュメント内の単語の数と種類にはほとんどの情報が含まれています。文書を分類する必要があります -- 文脈と文法はあまり詳細を追加しません。
とにかく、プロジェクトを開始するためのより良い場所を提供してくれることを願っています. それでも特定の部分で行き詰まっている場合は、もう一度質問してください。最善を尽くします。
Frabizio Sebastiani によるテキスト分類に関するこの調査論文をご覧ください。テキスト分類を行う最善の方法をすべて教えてくれます。
ここで、すべてを読むことを邪魔するつもりはありませんが、最後の近くに 1 つの表があり、さまざまな人々の手法がさまざまなテスト コーパスにどのように積み重なっているかを比較しています。それを見つけて、最良のものを選び(パーセプトロンでこれを行う方法を学ぶことが特に割り当てられている場合は、最良のパーセプトロンのもの)、その方法を詳細に説明している彼の引用した論文を読んでください.
これで、適切なトピック テキスト分類器を作成する方法がわかりました。
Oswald から提供された (および他の質問に投稿した) アルゴリズムをコードに変換することは、プログラミングの小さな問題 (TM) です。また、作業中に TF-IDF のようななじみのない用語に出くわした場合は、教師にそれらの用語を説明してもらうように依頼してください。
多層パーセプトロン (一般的な分類問題のための特定の NeuralNet アーキテクチャ。) GraphLab 関係者から Python で利用できるようになりました。
先日、似たようなものを実装してみました。英語のテキストと非英語のテキストを認識するコードを作成しました。私は AI や統計学を何年も行っていなかったので、散々な試みでした。
私のコードはここにあります (投稿を肥大化させたくありません): http://cnippit.com/content/perceptron-statistically-recognizing-english
入力:
- テキスト ファイルを取得し、それをトライグラムに分割します (例: "abcdef" => ["abc", "bcd", "cde", "def"])
- それぞれの相対頻度を計算し、それをパーセプトロンへの入力としてフィードします (つまり、26^3 の入力があります)。
自分が何をしていたのかよくわからないにもかかわらず、かなりうまく機能しているようです。ただし、成功はトレーニング データに大きく依存します。フランス語/スペイン語/ドイツ語のテキストなどでトレーニングするまで、結果は良くありませんでした。
ただし、これは非常に小さな例であり、値に多くの「幸運な推測」があります (例: 初期の重み、バイアス、しきい値など)。
複数のクラス: 区別したい複数のクラスがある場合 (つまり、「A か NOT-A か」という単純なものではない場合)、1 つのアプローチは、各クラスにパーセプトロンを使用することです。例えば。1 つはスポーツ用、もう 1 つはニュース用などです。
スポーツまたは非スポーツとしてグループ化されたデータでスポーツ パーセプトロンをトレーニングします。ニュースや非ニュースなどについても同様です。
新しいデータを分類するときは、入力をすべてのパーセプトロンに渡し、いずれかが true を返す (または「発火する」) と、そのデータが属するクラスになります。
私は大学時代にこのアプローチを使用しました。そこでは、手書き文字を認識するためにパーセプトロンのセットを使用していました。それはシンプルで、かなり効果的に機能しました (私の記憶が正しければ 98% 以上の精度)。