機械学習アルゴリズムをゼロから作成することで、多くの経験が得られます。ようやく読み終えたとき、嬉しい驚きを感じ、何が起こっているのか理解できます。 一部のアルゴリズムはより複雑なので、単純なアルゴリズムから始めるのではなく、単層パーセプトロンなどの非常に単純なアルゴリズムから始める必要があります。 この記事では、パーセプトロンを例に、アルゴリズムをゼロから作成するための次の 6 つの手順を説明します。
1. 基本的な理解 基礎を理解しなければ、アルゴリズムをゼロから取り組むことはできません。少なくとも、次の質問に答えられる必要があります。
パーセプトロンの観点から見ると、これらの質問に対する答えは次のようになります。
2. さまざまな学習リソースを活用する モデルの基本を理解したら、調査を開始できます。教科書でよりよく学習できる人もいれば、ビデオでよりよく学習できる人もいます。個人的には、いろいろなところを動き回って、さまざまなリソースから学ぶのが好きです。 数学的な詳細を学びたい場合、書籍は非常に効果的です(参照: https://www.dataoptimal.com/data-science-books-2018/ などですが、より実践的な例については、ブログや YouTube 動画をお勧めします。 パーセプトロンに関する優れたリソースをいくつか紹介します。 本:
ブログ:
ビデオ:
3. アルゴリズムをチャンクに分割する 材料が集まったので、学習を始めましょう。章やブログの投稿を最初から読むのではなく、まず章の見出しやその他の重要な情報をざっと読みます。要点を書き留めて、アルゴリズムの概要を説明してください。 この資料を読んだ後、私はパーセプトロンを次の 5 つのモジュールに分割しました。
次に、各モジュールの内容について詳しく説明します。 1. 重みを初期化する (1)まず重みベクトルを初期化する必要がある。 重みの数は特徴の数と同じである必要があります。 3 つの特徴があり、重みベクトルが以下に示すとおりであるとします。重みベクトルは通常 0 に初期化され、この例ではこの初期化値が使用されます。 (2)入力と重みを掛け合わせて合計する 次に、入力と重みを掛け合わせて合計する必要があります。理解しやすくするために、最初の行の重みとそれに対応する特徴を色分けしました。 特徴と重みを掛け合わせた後、その積を合計します。これは一般にドット積と呼ばれます。 最終結果は 0 であり、この一時的な結果を表すために「f」が使用されます。 (3)閾値と比較する ドット積を計算した後、それをしきい値と比較します。しきい値を 0 に設定しましたが、このしきい値を使用することも、他の値を試すこともできます。 以前に計算されたドット積「f」は 0 であり、しきい値 0 より大きくないため、推定値も 0 になります。 推定値に「y ハット」というラベルを付けます。ここで、y ハットの下付き文字 0 は最初の行に対応します。もちろん、最初の行を表すために 1 を使用することもできますが、どちらでも構いません。私は 0 から開始することを選択しています。 この結果を実際の値と比較すると、現在の重みでは実際の出力を正しく予測していないことがわかります。 予測が間違っていたため、重みを更新する必要があります。これが次のステップにつながります。 (4)重みを更新する 次の式を使用します。 基本的な考え方は、反復「n」で現在の重みを調整して、次の反復「n+1」で新しい重みを取得することです。 重みを調整するには、ギリシャ文字の「エータ(η)」で表される「学習率」を設定する必要があります。学習率は 0.1 に設定しましたが、しきい値と同様に、異なる値を使用できます。 このチュートリアルでは現在、次の内容を取り上げています。 ここで、反復 n = 2 の新しい重みの計算に進みます。 パーセプトロン アルゴリズムの最初の反復を正常に完了しました。 (5)繰り返し アルゴリズムが正しい出力を計算できなかったため、続行する必要があります。 通常、多数の反復が必要になります。データセットの各行を反復処理し、各反復で重みを更新します。一般的に、データ セットの完全な走査は「エポック」と呼ばれます。 データセットには 3 行あるため、1 エポックを完了するには 3 回の反復が必要です。 30 回の反復 (または 10 エポック) を指定するなど、アルゴリズムを実行するための反復またはエポックの合計数を設定することもできます。しきい値や学習率と同様に、エポックは自由に使用できるパラメーターです。 次の反復では、2 行目の機能を使用します。 計算プロセスはここでは繰り返されません。次の図は、次のドット積の計算を示しています。 次に、このドット積をしきい値と比較して新しい推定値を計算し、重みを更新して続行できます。データが線形に分離可能な場合、パーセプトロンは最終的に収束します。 5. 簡単な例から始める アルゴリズムを細分化したので、コードで実装を開始できます。 物事をシンプルにするために、私は通常、非常に小さな「おもちゃのデータセット」から始めます。この種の問題に適した、線形に分離可能な小さなデータ セットは NAND ゲートです。これはデジタル回路でよく使われる論理ゲートです。 このデータセットは小さいので、手動で Python に入力できます。モデルがバイアスを計算できるように、値が 1 のダミー特徴量「x0」の列を追加しました。バイアス項は、モデルが正しく分類することを促す傾向がある切片項と考えることができます。 データを入力するためのコードは次のとおりです。
前の章と同様に、アルゴリズムをステップごとに実行し、コードを記述してテストします。 1. 重みを初期化する 最初のステップは重みを初期化することです。
重みベクトルの長さは特徴の長さと一致する必要があることに注意してください。 NAND ゲートを例にとると、その長さは 3 です。 2. 重みと入力を掛け合わせて合計する この操作は、Numpy の .dot() メソッドを使用して簡単に実行できます。 重みベクトルと特徴の最初の行のドット積から始めます。
予想通り、結果は0です。前の注記との一貫性を保つために、ドット積を変数「f」とします。 3. 閾値と比較する 前のテキストとの一貫性を保つために、しきい値「z」は 0 に設定されています。ドット積「f」が 0 より大きい場合、予測値は 1 になり、それ以外の場合、予測値は 0 になります。予測値を変数yhatに設定します。
予想通り、予測値は 0 です。 上記のコード内のコメントでは、このステップが「アクティベーション関数」と呼ばれていることに気付いたかもしれません。このセクションの内容についてのより正式な説明は次のとおりです。 NAND 出力の最初の行から、実際の値は 1 であることがわかります。予測値が間違っているため、重みをさらに更新する必要があります。 4. 重みを更新する 予測が行われたので、重みを更新する準備が整いました。
学習率を前と同じように設定します。前のテキストと一貫性を保つために、学習率 η の値は 0.1 に設定されています。読みやすくするために、各重みの更新をハードコードします。 重量の更新が完了しました。 5. 繰り返し 各ステップが完了したので、それらをまとめることができます。 まだ説明していない最後のステップは損失関数です。これを最小化する必要があります。この場合は、二乗誤差項の合計です。 これを使用してエラーを計算し、モデルのパフォーマンスを確認します。 すべてをまとめると、完全な関数は次のようになります。
完全なパーセプトロン コードを記述したので、実行してみましょう。
6 回目の反復でエラーが 0 に近づき、残りの反復では 0 のままであることがわかります。誤差が 0 に近づき、0 のままになると、モデルは収束したことになります。これは、モデルが適切な重みを正しく「学習」したことを示しています。 次の部分では、計算された重みを使用して、より大きなデータセットで予測を行います。 5. 信頼できる実装で検証する これまで、さまざまな学習リソースを見つけ、アルゴリズムを手動で実行し、簡単な例でアルゴリズムをテストしてきました。 ここで、モデルを信頼できる実装と比較してみましょう。 scikit-learnのパーセプトロンを使用します (http://scikit-learn.org/stable/modules/generated/sklearn.linear_model.Perceptron.html)。 次の手順で比較します。
1. データのインポート まずデータをインポートします。ここで データセットのコピーを取得します。これは、パーセプトロンが機能することを確認するために作成した線形分離可能なデータセットです。確認のため、データもプロットしました。 グラフから、データを直線で分離できることが簡単にわかります。
文章 先に進む前に、描画のコードについて説明します。私は Pandas を使用して csv をインポートしました。これにより、データが自動的に DataFrame に格納されます。データをプロットするには、DataFrame から値を取得する必要があるため、.values メソッドを使用します。特徴は 1 列目と 2 列目にあるので、散布図機能でこれらの特徴を使用しました。列 0 は、切片を計算できるように値が 1 のダミー機能です。これは、前のセクションの NAND ゲート操作に似ています。 ***、散布図関数でc = df['3']、alpha = 0.8として2つのクラスに色を付けます。出力はデータの 3 番目の列 (0 または 1) なので、関数に列 "3" を使用して 2 つのクラスに色を付ける様に指示します。 Matplotlib 散布図関数の詳細については、こちらをご覧ください。 2. データをトレーニングセットとテストセットに分割する データが線形に分離可能であることが確認できたので、次はデータをセグメント化します。 過剰適合を避けるために、テスト セットとは異なるデータセットでモデルをトレーニングすることをお勧めします。さまざまなアプローチがありますが、簡単にするために、トレーニング セットとテスト セットを使用します。まずデータをシャッフルします。
まず、データを DataFrame から numpy 配列に変換します。これにより、.shuffle などの numpy 関数が使いやすくなります。結果の再現性を確保するために、ランダムシード(5)を設定しました。それが完了したら、ランダムシードを変更して結果がどのように変化するかを確認してみました。次に、データの 70% をトレーニング セットに、30% をテスト セットに分割します。
最後のステップは、トレーニング セットとテスト セットの特徴と出力を分離することです。
この例では、データの 70% をトレーニング セットとして使用し、データの 30% をテスト セットとして使用しました。k 分割交差検証などの他の方法を検討することもできます。 3. パーセプトロンのトレーニング 前の章で作成したコードを再利用できます。
次に、重みと二乗誤差項の合計を確認します。
重みは今のところあまり意味がありませんが、パーセプトロンをテストし、モデルを scikit-learn モデルと比較するときにこれらの値を再度使用します。 二乗誤差の合計は、データが線形に分離可能であるため予想通り、パーセプトロンが収束したことを示しています。 4. パーセプトロンのテスト 次はパーセプトロンをテストします。モデルをテストするために、小さな perceptron_test 関数を作成します。前回の記事と同様に、この関数は、perceptron_train 関数と特徴および活性化関数を使用して以前に計算した重みのドット積を取り、予測を行います。これまで見たことがないのは、scikit-learn の評価メトリック関数である acceleration_score だけです。 これらすべてをまとめると、コードは次のようになります。
スコア 1.0 は、モデルがすべてのテスト データに対して正しい予測を行ったことを意味します。データセットは明確に分離可能なので、結果は予想どおりになります。 5. scikit-learnパーセプトロンとの比較 最後のステップは、パーセプトロンを scikit-learn のパーセプトロンと比較することです。次のコードは、scikit-learn パーセプトロンのコードです。
モデルをトレーニングしたので、このモデルの重みをモデルによって計算された重みと比較できます。
scikit-learn モデルの重みは、私たちのモデルの重みとまったく同じです。これは、モデルが正しく動作していることを意味しており、良いニュースです。 最後にいくつか質問があります。 scikit-learn モデルでは、ランダム状態を None に設定し、データをシャッフルしませんでした。これは、すでにランダムシードを設定し、データをスクランブルしているため、再度行う必要がないためです。また、学習率 eta0 をモデルと同じ 0.1 に設定する必要があります。最後のポイントはインターセプトです。ダミーの特徴列に値 1 を設定しているため、モデルは自動的に切片を適合させることができるため、scikit-learn パーセプトロンでこれをオンにする必要はありません。 これらは小さな詳細のように思えるかもしれませんが、これらがなければ、私たちのモデルは同じ結果を再現できません。これが重要なポイントです。モデルを使用する前に、ドキュメントを読んで、さまざまな設定が何をするのかを理解することが重要です。 6. プロセスを書き留める これはプロセスの最後のステップであり、おそらく最も重要なステップです。 ここまでは、勉強し、メモを取り、アルゴリズムをゼロから書き、信頼できる実装と比較するというプロセスを経てきました。これらの努力を無駄にしないでください! プロセスを書き留める理由は 2 つあります。
機械学習ライブラリからアルゴリズムを実装するのは一つのことですが、ゼロから実装するのはまた別の話であり、それは素晴らしいこととなるでしょう。 GitHub プロフィールは、自分の仕事内容を紹介するのに最適な方法です。 要約する この記事では、パーセプトロンをゼロから実装する方法を説明します。これは、自分で実装しながら、アルゴリズムをより深く学ぶための優れた方法です。ほとんどの場合、信頼できる実装を使用しますが、内部で何が起こっているかを本当に深く理解したい場合は、アルゴリズムを最初から実装してみるとよいでしょう。 オリジナルリンク: https://www.dataoptimal.com/machine-learning-from-scratch/ [この記事は51CTOコラム「Machine Heart」、WeChatパブリックアカウント「Machine Heart(id:almosthuman2014)」によるオリジナル翻訳です] この著者の他の記事を読むにはここをクリックしてください |
<<: モノのインターネット業界は一時的な流行に過ぎないのでしょうか、それとも産業史上の重要な節目となるのでしょうか?
>>: Huyaは人間とシーンの分離技術を使用して、顔を覆わずにスマートな弾丸スクリーンを作成します
相関ルールは、データ間の潜在的な関連性を発見するために使用されます。最も一般的なアプリケーションは、...
あるアナリスト会社は、生成型AIという熱狂的な分野にとって来年は現実を突きつけられる年になると予測し...
最近、ディープラーニングと人工知能に関するジョークがソーシャルメディア上で広く流布しており、この2つ...
2014年、日本のソフトバンクモバイルストアに新たな仲間が加わった。それは、人の表情や声のトーンを...
研究者にとって、適切な形状を選択することは、ロボットが特定の地形を移動できる能力にとって非常に重要で...
時間と空間を結びつけるのは速度であり、エネルギーと質量を結びつけるのも速度です。事実と価値を結びつけ...
世界保健機関によれば、毎年80万人が自殺で亡くなっている。 この数字は年々高いままですが、人工知能と...
[[262639]]これまで、データラベラーは常に「AI に置き換えられる最初のグループ」と呼ばれて...
Python で任意の数の変数に対する多重線形回帰をゼロから開発する方法を学びます。線形回帰はおそら...
専門家は、この画期的な進歩により、人工知能を使って新たながん治療法を開発するという新しい時代が到来す...
この時代において、プライバシーは長い間誤った主張となってきました。プライバシー保護をある程度回復する...