🐥

Rustを使って、ゼロから作るDeep Learning(1)

2022/12/15に公開

前書き

「ゼロから作るDeep Learning」を、シリーズとして更新して行こうと思います。
以前からニューラルネットワークに興味があり、その記録として残していきます。今回は、ニューラルネットワークの基礎の基礎でもあるパーセプトロンという考え方について、コードベースで書いていきます。

本題

パーセプトロンとは

パーセプトロンはニューラルネットワーク(ディープラーニング)の起源となるアルゴリズムです。
複数の信号を入力として受け取り、一つの信号を出力します。入力された信号は、それぞれ固有の重みが乗算されます。送られてきた信号の総和が計算され、その総和が閾値を超えた場合にのみ1を出力します。

プログラミングで表すと以下の通りです。

// ここでは、入力値をx、 wを重み、閾値をtとしています
if w1 * x1 + w2 * x2 <= t {
  return 0;
} else { // w1 * x1 + w2 * x2 > t
  return 1;
}

簡単な実装例

ここでは、パーセプトロンを使ってできるANDゲートを実装をしています。

main.rs
fn main() {
    let mut result: u8;
    
    result = and(0, 0);
    println!("{}", result);

    result = and(1, 0);
    println!("{}", result);

    result = and(0, 1);
    println!("{}", result);

    result = and(1, 1);
    println!("{}", result);
}

fn and(x1: i32, x2: i32) -> u8 {
    let w1 = 0.5; // x1の重み
    let w2 = 0.5; // x2の重み
    let theta = 0.7; //閾値

    // 型を浮動小数点型にキャストしてから計算
    let f_x1 = x1 as f32;
    let f_x2 = x2 as f32;
    let tmp = f_x1 * w1 + f_x2 * w2;

    if tmp <= theta {
        0
    } else {
        1
    }
}

他にも、NAND/ORも実装できます。

後書き

web開発を中心としてきたのでスクリプト言語ばかり学んできたのですが、1から学んでいこうという想いで、プログラミングとして綺麗だなと感じたRustで実装してみました。Rustもニューラルネットワークも勉強しつつの記事更新になっていきますが、よろしければ参考にしてみて下さい。

Discussion