5分でわかる「ニューロン」

CPU、GPU、FPGAの演算器をフルに活用し、ビッグデータを解析。実ビジネスの課題を解決できるディープラーニング。APSにも多数のお問い合わせを頂いております。そこで、ディープラーニングに登場するキーワードを順次紹介していきたいと思います。

今回は「ニューロン」です!

図

ディープラーニング:多層結合の演算システム

まず「ディープラーニング」についておさらいしましょう。

ディープラーニングを活用したシステムは、学習と推論という二つのフェーズから運用されます。まず、予め収集しておいたビッグデータに含まれる(入力[input],出力[output])のペアに最適な計算式を作るのが「学習フェーズ」です。そして計算式を使って、実際のセンサー入力やカメラ画像を解析し出力を導くのが「推論フェーズ」です。例えばかけ算を例にすると…

問題:次の○を知りたい、ただし(input, output) = (3, 6)
(第一層)input × ○ = output
答え:○ = 2

問題:次の○、●を知りたい、ただし(input, output) = (3, 12), (1, 4)
(第一層)input × ○ = input2
(第二層)input2 × ● = output
答え:○ = 1, ● = 3

このように input × a + b = output という単純な計算式(BLAS)を重ねていくことにより、複雑なシステムを実現できます。ディープラーニングを活用したアプリケーションには自立運転動作であったり、故障予知であったり、様々なタイプのものがありますが、詰まるところ最も単純なinput × a + b = outputの組み合わせにより近似することができます(テイラー多項式)。

ニューロン

図

ディープラーニング・システムを単純に表現するための最小単位が「ニューロン」です。人の脳にあるニューラルネットワーク構造から名前を採っているため、「人工ニューロン」と呼ばれることもあります。ニューロンの主な働きは、いくつかの入力を受けて、各情報の重要性(重み)を掛け加えて総和(合計)を算出し、基準以上か基準以下かを判断します。判断した結果が次のニューロンに伝えらます。

例えば、ディズニーランドに行くかどうかを判断するシステムを考えてみましょう。入力は、大きな期待感(x0)、新アトラクションの有無(x1)、当日の天候(x2)、自分がインフルエンザ(x3)かであり、出力は行くか(1)、休むか(0)です。この判断システムの最も大きな重みは「インフルエンザかどうか」でしょう。期待が高く、外が最高の天気でも、残念ながら休む(0)を選択しなければなりません。ディープラーニングにおけるニューロンは、このような重み付けの掛け算、微調整(オフセット)の加算、しきい値の判定、を行います。

ニューロンの多層化・多チャンネル化

先の例では、ニューロンが1つでしたが、数万ニューロンを深さ方向(層)、幅方向(チャンネル)としてつなぎ合わせることにより、日本の月毎のインフルエンザの流行者数から、ディズニーランドの混雑具合を予想し、明日コーラが何本売れるかを推定し発注。無人の物流システムを実現できる…そんな未来も遠くないかもしれません。アイディア次第であらゆる情報を解析し、活用できることがディープラーニングやAIという技術の面白さです。

図

C言語で書いてみましょう

最後に、上の節で紹介しましたニューロンをC言語で実装をしてみました。なるほどね、と感じていただけたら嬉しいです(この表現が好きな方いましたら、今後も続けていきたいので是非twitterで拡散してくださいw)。

ソースコード

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define INPUT_NUM (4)

int
main
(int argc, char* argv[])
{
    int input[INPUT_NUM];
    int output[1];
    int weight[INPUT_NUM] = {2, 3, 1, -200};
    int offset[INPUT_NUM] = {5, 4, 2, 0};
    if (argc >= INPUT_NUM + 1) {
        for (int i = 0; i < INPUT_NUM; i++) {
            input[i] = atoi(argv[i+1]);
        }
    }

    int sum = 0;
    for (int i = 0; i < INPUT_NUM; i++) {
        sum += input[i] * weight[i] + offset[i];
    }

    if(sum > 5) {
        output[0] = 0;
    } else {
        output[0] = 1;
    }

    printf("input  = %4d, %4d, %4d, %4d\n", input[0], input[1], input[2], input[3]);
    printf("---\n");
    printf("weight = %4d, %4d, %4d, %4d\n", weight[0], weight[1], weight[2], weight[3]);
    printf("offset = %4d, %4d, %4d, %4d\n", offset[0], offset[1], offset[2], offset[3]);
    printf("sum    = %4d\n", sum);
    printf("---\n");
    printf("output = %4d\n", output[0]);

    return 0;
}

					

実行結果

行きたい気持ちはあるけれど・・・天気が悪い → 休まない!

$ ./test 10 20 -50 0
input  =   10,   20,  -50,    0
---
weight =    2,    3,    1, -200
offset =    5,    4,    2,    0
sum    =   41
---
output =    0
					

行きたい気持ちはあるけれど・・・インフルエンザ → 休むしかない!

$ ./test 10 20 10 1
input  =   10,   20,   10,    1
---
weight =    2,    3,    1, -200
offset =    5,    4,    2,    0
sum    =  -99
---
output =    1
					

まとめ

AI/ディープラーニングに登場するキーワードを順次紹介する企画、今回はニューロンでした。積と和が連携していることから積和演算とも呼ばれます。より早くAI/ディープラーニングを実行するため、現在多くのAI/ディープラーニング用のプロセッサ(NPU:Neural-network-Processing-Unit)には積和演算ユニットが搭載されています(詳細はまた後日)。