single
チャレンジ:フィードフォワードネットワークの実装
メニューを表示するにはスワイプしてください
自然言語処理のためのTransformerアーキテクチャを探求する中で、各Transformerブロック内に存在する重要な構成要素である**位置ごとのフィードフォワードネットワーク(FFN)**に出会います。自己注意機構が入力表現を処理した後、FFNはシーケンス内の各位置でこれらの表現を他の位置とは独立してさらに変換します。これは、文中の各トークンに対して同じ小さなニューラルネットワークが適用されることを意味し、モデルがさらなる非線形性を導入し、テキストからより複雑なパターンを学習できるようにします。FFNは、自己注意によってエンコードされた情報を洗練し、特に人間の言語の微妙さや曖昧さに対処する際に関係性を捉えるために不可欠です。
123456789101112131415161718192021222324252627282930313233import numpy as np def relu(x): return np.maximum(0, x) class PositionWiseFeedForward: def __init__(self, d_model, d_ff): # Initialize weights and biases for two linear layers self.W1 = np.random.randn(d_model, d_ff) * 0.01 self.b1 = np.zeros((1, d_ff)) self.W2 = np.random.randn(d_ff, d_model) * 0.01 self.b2 = np.zeros((1, d_model)) def __call__(self, x): # x shape: (batch_size, seq_len, d_model) # Apply first linear layer and ReLU activation out1 = relu(np.matmul(x, self.W1) + self.b1) # Apply second linear layer out2 = np.matmul(out1, self.W2) + self.b2 return out2 # Example usage: batch_size = 2 seq_len = 4 d_model = 8 d_ff = 16 # Example input: random tensor simulating text representations x = np.random.randn(batch_size, seq_len, d_model) ffn = PositionWiseFeedForward(d_model, d_ff) output = ffn(x) print("Output shape:", output.shape)
上記のコードでは、numpyを用いた位置ごとのフィードフォワードネットワークのシンプルな実装例を示しています。このネットワークは、2つの線形変換(行列積)と、それらの間に配置されたReLU活性化関数で構成されています。
ReLU活性化関数:ReLU(Rectified Linear Unit)活性化関数は relu(x) = max(0, x) と定義される。すべての負の値をゼロにし、正の値はそのまま保持する。ReLUはフィードフォワードネットワークで非線形性を導入するために使用され、ネットワークがデータからより複雑なパターンを学習できるようにする。
最初の線形層は、入力を d_model 次元(各トークンの埋め込みサイズ)からより高次元の空間 d_ff へ射影し、モデルがより複雑な特徴を捉えられるようにする。2番目の線形層は、結果を元の d_model サイズに戻す。このネットワークはシーケンス内の各位置に独立して適用されるため、1つのトークンへの変換が他のトークンに直接影響を与えることはない。この独立性により、モデルは各トークンの表現を並列に処理でき、Transformerがテキストデータに対して非常に効率的になる。
スワイプしてコーディングを開始
numpy を使用して位置ごとのフィードフォワードネットワーク関数を実装します。
position_wise_ffn(x, W1, b1, W2, b2) という関数を定義してください。この関数は次の引数を取ります:
x: 形状がnumpyの(batch_size, seq_len, d_model)配列W1: 形状がnumpyの(d_model, d_ff)配列b1: 形状がnumpyの(1, d_ff)配列W2: 形状がnumpyの(d_ff, d_model)配列b2: 形状がnumpyの(1, d_model)配列
シーケンス内の各位置に対して、以下を適用します:
- 線形変換:
out1 = x @ W1 + b1 - ReLU 活性化関数:
out1 = relu(out1) - 2 回目の線形変換:
out2 = out1 @ W2 + b2
出力配列 out2(形状は (batch_size, seq_len, d_model))を返してください。
解答
フィードバックありがとうございます!
single
AIに質問する
AIに質問する
何でも質問するか、提案された質問の1つを試してチャットを始めてください