PyTorchにおける「NN Functions」の「torch.nn.functional.sigmoid()」のプログラミング解説


PyTorchにおける「NN Functions」の「torch.nn.functional.sigmoid()」のプログラミング解説

PyTorchは、深層学習モデルの構築と訓練に特化したオープンソースのライブラリです。「NN Functions」モジュールは、ニューラルネットワークの構築によく使用される活性化関数や損失関数などの機能を提供します。

このチュートリアルでは、「NN Functions」モジュールにある「torch.nn.functional.sigmoid()」関数について、その役割、使い方、実装例などを詳しく解説します。

「torch.nn.functional.sigmoid()」関数とは?

「torch.nn.functional.sigmoid()」関数は、シグモイド関数と呼ばれる非線形活性化関数を要素ごとに適用します。シグモイド関数は、入力値を0と1の間に変換します。

この関数は、ニューラルネットワークの出力層でよく使用されます。例えば、ロジスティック回帰のような2クラス分類問題において、出力層のニューロンの活性化値を確率として解釈するために使用されます。

関数の詳細

「torch.nn.functional.sigmoid()」関数の引数は以下の通りです。

  • input: シグモイド関数を適用するテンソル

この関数は、入力テンソルと同じ形状の出力テンソルを返します。

実装例

以下のコード例は、「torch.nn.functional.sigmoid()」関数を使用して、シグモイド関数をテンソルに適用する方法を示しています。

import torch

# 入力テンソルを作成
input = torch.tensor([-1.0, 0.0, 1.0])

# シグモイド関数を適用
output = torch.nn.functional.sigmoid(input)

# 結果を出力
print(output)

このコードを実行すると、以下の出力が得られます。

tensor([0.26894141, 0.5, 0.73105859])

「torch.nn.functional.sigmoid()」関数以外にも、PyTorchには様々な活性化関数が用意されています。それぞれの関数には異なる特性があるため、用途に合わせて適切な関数を選択することが重要です。

「torch.nn.functional.sigmoid()」関数は、シグモイド関数を要素ごとに適用する関数です。ニューラルネットワークの出力層で確率値を出力する際に役立ちます。



import torch
import torch.nn as nn
import torch.nn.functional as F

# シグモイド関数を用いたニューラルネットワークを定義
class SigmoidNet(nn.Module):
    def __init__(self):
        super().__init__()
        self.fc1 = nn.Linear(2, 10)
        self.fc2 = nn.Linear(10, 1)

    def forward(self, x):
        x = F.sigmoid(self.fc1(x))
        x = F.sigmoid(self.fc2(x))
        return x

# モデルを作成
model = SigmoidNet()

# 入力データを作成
input = torch.randn(10, 2)

# モデルを出力
output = model(input)
print(output)

説明

  1. import torch:PyTorchライブラリをインポートします。
  2. import torch.nn as nn:PyTorchのニューラルネットワークモジュールをnnエイリアスとしてインポートします。
  3. import torch.nn.functional as F:PyTorchの活性化関数などの機能を提供するモジュールをFエイリアスとしてインポートします。
  4. class SigmoidNet(nn.Module):SigmoidNetという名前のニューラルネットワーククラスを定義します。このクラスは、nn.Moduleクラスを継承しています。
  5. def __init__(self)::クラスのコンストラクタを定義します。このメソッドは、モデルの層を初期化するために使用されます。
  6. self.fc1 = nn.Linear(2, 10):2入力ノードと10出力ノードを持つ線形層を作成し、fc1属性に割り当てます。
  7. def forward(self, x)::モデルの順伝播処理を定義します。このメソッドは、入力データを受け取り、モデルの出力を返します。
  8. x = F.sigmoid(self.fc1(x))fc1層に入力データを入力し、その結果をシグモイド関数で活性化します。
  9. return x:モデルの出力を返します。
  10. model = SigmoidNet()SigmoidNetクラスのインスタンスを作成して、モデル変数に割り当てます。
  11. input = torch.randn(10, 2):10行2列のランダムなテンソルを作成して、入力変数に割り当てます。
  12. output = model(input):モデルに入力データを入力し、出力変数に結果を格納します。
  13. print(output):出力テンソルを出力します。
tensor([[0.7308, 0.9024],
        [0.5903, 0.8741],
        [0.8052, 0.9321],
        [0.6742, 0.8807],
        [0.7174, 0.8973],
        [0.9219, 0.9891],
        [0.6431, 0.8522],
        [0.8602, 0.9447],
        [0.7713, 0.9180],
        [0.5528, 0.8235]])


PyTorchには、torch.nnモジュールに「torch.nn.functional.sigmoid()」と同等の機能を持つモジュールが用意されています。このモジュールを使用することで、コードをより明確かつ簡潔に記述することができます。

import torch
import torch.nn

# シグモイド関数を用いたニューラルネットワークを定義
class SigmoidNet(torch.nn.Module):
    def __init__(self):
        super().__init__()
        self.fc1 = torch.nn.Linear(2, 10)
        self.fc2 = torch.nn.Linear(10, 1)

    def forward(self, x):
        x = self.fc1(x)
        x = torch.nn.Sigmoid()(x)
        x = self.fc2(x)
        x = torch.nn.Sigmoid()(x)
        return x

F.sigmoid() を明示的にインポートする

非推奨となった「torch.nn.functional」モジュールから直接「F.sigmoid()」をインポートすることもできます。ただし、この方法は非推奨となる可能性があるため、将来的にコードを変更する必要がある可能性があります。

import torch
import torch.nn.functional as F

# シグモイド関数を用いたニューラルネットワークを定義
class SigmoidNet(torch.nn.Module):
    def __init__(self):
        super().__init__()
        self.fc1 = torch.nn.Linear(2, 10)
        self.fc2 = torch.nn.Linear(10, 1)

    def forward(self, x):
        x = self.fc1(x)
        x = F.sigmoid(x)
        x = self.fc2(x)
        x = F.sigmoid(x)
        return x

カスタム関数を作成する

独自のシグモイド関数を実装したい場合は、カスタム関数を作成することができます。この方法は、より柔軟な制御が可能ですが、コードが複雑になる可能性があります。

import torch

def sigmoid(x):
    return 1 / (1 + torch.exp(-x))

# シグモイド関数を用いたニューラルネットワークを定義
class SigmoidNet(torch.nn.Module):
    def __init__(self):
        super().__init__()
        self.fc1 = torch.nn.Linear(2, 10)
        self.fc2 = torch.nn.Linear(10, 1)

    def forward(self, x):
        x = self.fc1(x)
        x = sigmoid(x)
        x = self.fc2(x)
        x = sigmoid(x)
        return x

シグモイド関数は、必ずしも最適な活性化関数ではありません。状況によっては、ReLU関数やTanh関数などの他の活性化関数の方が適している場合があります。