機械学習や AI の愛好家であれば、パーセプトロンという言葉を聞いたことがあるはずです。パーセプトロンは、多くの深層学習コースの最初の章で教えられます。では、それは一体何なのでしょうか?その背後にあるインスピレーションは何ですか?分類問題はどのように正確に解決されるのでしょうか?この記事では、パーセプトロンの背後にある生物学的なインスピレーションから始めて、次にその数学的技術を掘り下げ、最後にパーセプトロン ユニットを使用してバイナリ分類器をゼロから構築します。
ニューラルネットワークの生物学的インスピレーション
ニューロン (神経細胞) は、神経系の基本的な構成要素です。人間の脳は、相互接続された数十億のニューロンで構成されています。脳からの信号の送受信を担当します。下の図に見られるように、典型的なニューロンは、樹状突起、軸索、細胞体または細胞体という 3 つの主要な部分で構成されています。樹状突起は細胞体から生じる木のような枝です。彼らは他のニューロンから情報を受け取ります。ソーマはニューロンの核です。樹状突起から受け取った情報を処理する責任があります。軸索は、ニューロンが情報を送信するケーブルのようなものです。 軸索は、その末端に近づくにつれて多くの枝に分かれ、樹状突起を介して他のニューロンと接続します。の 軸索と他のニューロン樹状突起間の接続はシナプスと呼ばれます。
イメージソース: ウィレムス、K. (2017 年 2 月 XNUMX 日)。 Keras チュートリアル: Python での深層学習.
ANN は脳の機能にインスピレーションを受けているので、脳がどのように機能するかを見てみましょう。脳は数十億のニューロンのネットワークで構成されています。それらは、あるニューロンからの情報が他のニューロンに伝達されるシナプスを介して電気的および化学的信号によって通信します。伝達プロセスには、「活動電位」と呼ばれる電気インパルスが関係します。情報が伝達されるためには、入力信号 (インパルス) が特定の閾値の壁を越えるのに十分な強さでなければなりません。その後、ニューロンだけが活性化して信号をさらに伝達します (出力)。
アメリカの科学者フランク ローゼンブラットは、ニューロンの生物学的機能に触発されて、1957 年にコーネル航空研究所でパーセプトロンの概念を思いつきました。
- ニューロンは、さまざまな強度の電気インパルスの形で他のニューロンから情報を受け取ります。
- ニューロンは、他のニューロンから受け取るすべてのインパルスを統合します。
- 結果の合計が特定のしきい値より大きい場合、ニューロンが「発火」し、接続されている他のニューロンに伝達される活動電位を引き起こします。
パーセプトロンの主要コンポーネント
ローゼンブラットのパーセプトロンは基本的にバイナリ分類器です。パーセプトロンは 3 つの主要部分で構成されます。
- 入力ノードまたは入力レイヤー: 入力レイヤーは、さらなる処理のために初期データをシステムに取り込みます。各入力ノードは数値に関連付けられます。任意の実数値を取ることができます。
- 重みとバイアス: 重みパラメーターは、ユニット間の接続の強さを表します。重みが大きいほど、関連する入力ニューロンの出力を決定する影響が強くなります。バイアスは、一次方程式の切片と同じ役割を果たします。
- 活性化関数: 活性化関数は、ニューロンが発火するかどうかを決定します。最も単純な活性化関数はステップ関数ですが、シナリオに基づいてさまざまな活性化関数を使用できます。
これらについては、次のセクションで詳しく説明します。
パーセプトロンの働き
最初のステップでは、すべての入力値にそれぞれの重みが乗算され、加算されます。得られた結果は加重和と呼ばれます ∑wi*xi, あるいは別の言い方をすると、 x1*w1 + x2*w2 +…wn*xn。この合計により、入力の重要性に基づいて入力が適切に表現されます。さらに、バイアス用語 b この合計に が加算されます ∑wi*xi + b。バイアスは、モデルのパフォーマンスを向上させるために調整できる別のモデル パラメーター (重みに加えて) として機能します。
2 番目のステップでは、活性化関数 f 上記の合計額に適用されます ∑wi*xi+ b 出力 Y = を取得します f(∑wi*xi + b)。使用されるシナリオとアクティベーション関数に応じて、 出力 どちらかです バイナリ {1, 0} または連続値。
(多くの場合、これらのステップは両方とも多層パーセプトロンでは 1 つのステップとして表されますが、ここでは理解を助けるために 2 つの異なるステップとして示しています)
活性化関数
生物学的ニューロンは、特定のしきい値を超えた場合にのみ発火します。同様に、人工ニューロンも、入力の合計 (加重合計) が特定のしきい値、たとえば 0 を超えた場合にのみ起動します。直感的には、次のようなルールベースのアプローチを考えることができます。
∑wi*xi + b > 0の場合: 出力 = 1 それ以外: 出力 = 0
そのグラフは次のようになります。
これは実際、Rosenblatt によって最初に使用されたユニット ステップ (しきい値) アクティベーション関数です。しかし、ご覧のとおり、この関数は 0 で不連続であるため、数学的計算で問題が発生します。上記の関数のよりスムーズなバージョンはシグモイド関数です。 0 から 1 の間を出力します。もう XNUMX つは双曲線正接 (tanh) 関数は、-1 と 1 の間の出力を生成します。シグモイド関数とタン関数はどちらも勾配消失の問題に悩まされます。現在、ReLU と Leaky ReLU が最もよく使用されている活性化関数です。これらは深いネットワーク上でも比較的安定しています。
バイナリ分類子としてのパーセプトロン
これまで、生物学的なインスピレーションとパーセプトロンの数学を見てきました。このセクションでは、パーセプトロンが線形分類問題をどのように解決するかを見ていきます。
いくつかのライブラリをインポートしています –
sklearn.datasets から make_blobs をインポート matplotlib.pyplotをpltとしてインポート numpyをnpとしてインポート %matplotlib インライン
を使用してダミー データセットを生成する make_blob scikit learn によって提供される機能 –
# データセットを生成する X、Y = make_blobs(n_features = 2、centers = 2、n_samples = 1000、random_state = 12)
# データセットを視覚化する plt.figure(figsize = (6, 6)) plt.scatter(X[:, 0], X[:, 1], c = Y) plt.title('真実', fontsize = 18) plt.show()
青い点が 1、緑の点が 0 だとします。パーセプトロン ロジックを使用すると、決定境界を作成できます(超平面) グラフ上の異なるデータポイントを分離する分類用。
さらに進む前に、入力ベクトルにバイアス項 (1) を追加しましょう。
# 入力ベクトルにバイアスを追加します X_bias = np.ones([X.shape[0], 3]) X_bias[:, 1:3] = X
データセットは次のようになります –
ここで、上記のデータセットの各行は入力ベクトル (データポイント) を表します。決定境界を作成するには、適切な重みを見つける必要があります。重みは、以下のルールを使用してトレーニングから「学習」されます。
w = w + (期待値 — 予測値) * x
これは、グランド トゥルースから推定結果を減算し、これに現在の入力ベクトルを乗算し、古い重みをそれに追加して、新しい重みの値を取得することを意味します。出力が実際のクラスと同じである場合、重みは変わりません。ただし、推定がグランドトゥルースと異なる場合は、それに応じて重みが増減します。このようにして、反復ごとに重みが段階的に調整されます。
まず重みベクトルに任意の値を割り当て、次に誤差と手元のデータを使用して反復ごとに段階的に値を調整します。
# ランダムな値で重みを初期化する w = np.random.rand(3, 1) プリント(w)
出力:
[[0.37547448] [0.00239401] [0.18640939]]
パーセプトロンの活性化関数を定義する –
def activity_func(z): z >= 1 の場合: 1 を返し、それ以外の場合: 0 を返します。
次に、パーセプトロン学習ルールを適用します。
for _ in range(100): for i in range(X_bias.shape[0]): y = activity_func(w.transpose().dot(X_bias[i, :])) # 重みを更新 w = w + (( Y[i] - y) * X_bias[i, :]).reshape(w.shape[0], 1)
重みが 100 回のパスで収束することは保証されていないため、学習ルールを常に適用しながら、すべてのトレーニング データをパーセプトロン アルゴリズムに XNUMX 回フィードし、最終的に最適な重みを取得します。
最適な重みが得られたので、次のようにします。 Y = を使用して各データポイントのクラスを予測します。 f(∑wi*xi + b) またはベクトル形式の Y = wT.x。
# データポイントのクラスを予測する result_class = [activation_func(w.transpose().dot(x)) for x in X_bias]
決定境界と予測されたクラスラベルを視覚化します –
# 単位ベクトルに変換 w = w/np.sqrt(w.transpose().dot(w))
# 結果を視覚化する plt.figure(figsize = (6, 6)) plt.scatter(X[:, 0], X[:, 1], c = result_class) plt.plot([-10, -1], 超平面([-10, -1], w), lw = 3, c = 'red') plt.title('決定境界によるパーセプトロン分類') plt.show()
グラウンド トゥルース イメージと予測結果イメージを比較すると、誤って分類されたいくつかのポイントを確認できます。精度を計算すると、約 98% になります (これは読者の演習として残しておきます)。
ご覧のとおり、ここでは元のデータがかなり分離されていたため、非常に高い精度を得ることができました。しかし、現実世界のデータの場合はそうではありません。単一のパーセプトロンを使用すると、線形の決定境界しか構築できないため、データが混在している場合、パーセプトロン アルゴリズムのパフォーマンスが低下します。これは、単一パーセプトロン モデルの制限の 1 つです。
残念
私たちは、ローゼンブラットのパーセプトロンの背後にある生物学的インスピレーションを理解することから始めました。次に、パーセプトロンと活性化関数の数学に進みました。最後に、おもちゃのデータセットを使用して、異なるクラスに属するデータポイントを分離する線形決定境界を構築することで、パーセプトロンがどのように基本的な分類を実行できるかを確認しました。
著者について
プラティック・ナブリヤ 現在、ノイダを拠点とする分析および AI 会社に勤務している熟練したデータ サイエンティストです。彼は機械学習、深層学習、NLP、時系列分析、データ操作、SQL、Python に堪能であり、クラウド環境での作業に精通しています。余暇には、ハッカソンに参加したり、技術的な記事を書いたりすることが大好きです。
- "
- &
- 100
- Action
- AI
- アルゴリズム
- すべて
- アメリカ
- 分析
- 分析論
- 記事
- 物品
- ボディ
- 支店
- ビルド
- 建物
- 変化する
- 化学物質
- 分類
- クラウド
- 接続
- Connections
- 電流プローブ
- データ
- データサイエンティスト
- 深い学習
- 環境
- 運動
- 最後に
- 火災
- 会社
- 名
- フォーム
- function
- 良い
- グリーン
- こちら
- 認定条件
- HTTPS
- 画像
- 増える
- 影響
- 情報
- ひらめき
- IT
- keras
- ラベル
- LEARN
- 学習
- 機械学習
- 操作
- 数学
- メディア
- ミディアム
- ネットワーク
- ネットワーク
- ニューラル
- ニューラルネットワーク
- NLP
- ノード
- 注文
- その他
- パフォーマンス
- Python
- 読者
- 結果
- So
- SQL
- start
- 開始
- 技術的
- グラフ
- 時間
- おもちゃ
- トレーニング
- チュートリアル
- アップデイト
- us
- 値
- 対
- W
- 何ですか
- 作品
- X