ニューラルネットワークとその他

最近したことのメモ

ニューラルネットワーク作成

delta値の計算やweight補正値の計算の際、レイヤーにキャッシュしておく値を間違えて1日嵌まって完成に2日費やした。

delta値は活性化関数に通す前の値で計算し、weightは活性化関数を通したpreviousレイヤーの出力キャッシュ(すなわちにcurrentレイヤーの入力キャッシュ、横ベクトル)とdelta値(縦ベクトル)の直積で行列を作成し、学習率を乗じて補正する。

入力を横ベクトル、レイヤー上のニューロンのweightをニューロン数x入力ノード数の行列で表現しておくと、レイヤーを通過した出力がベクトルと行列のドット積で良い感じにシンプルに書ける。Numpy万歳!

  • 参考文献

www.oreilly.co.jp


マルチスレッド・マルチプロセス

Pythonconcurrent.futuresモジュールでメチャクチャ簡単に実装できた。

import concurrent.futures as cf
with cf.ThreadPoolExecutor() as executor:
    #使用例
    futures = [executor.submit(func, *args) for _ in iterable]
    #futuresの中身全てをジョイン
    executor.as_completed(futures) 
    #または
    results = executor.map(func, iterable)

といった数行で、マルチスレッドもマルチプロセスも実装できる。(https://docs.python.org/ja/3/library/concurrent.futures.html accessed on 2020/09/22)

実装したものは様々なレイヤー構造・学習率で機械学習の精度を確かめるという目的で使用したが、一度にPythonインタープリターを4つ起動したらCPUがヒーヒー言ってた。

Node.js入門

ちょっとした非同期処理を行うサーバーを作成したが、活用する機会がなさそうなのでやめた。

昔(半年前?)は「コールバックとは???」であったが、今では「あーあれね。処理が終わったら呼び出すやつね。」となったのは何の知識が影響したのだろう。

アロー関数も「???」状態で使っていたが、Pythonで「lambda」ばっか書きまくってたら抵抗がなくなった。むしろ毎回「function」て書いていられないだろ。

zipファイルダウンロードの自動化

そのままダウンロードしたものを解凍し、特に必要なファイルだけ別のディレクトリへコピー。shutilモジュールとzipfileモジュール練習になった。

レスポンスってzipファイルとかも含まれるんだね。

デコレータの応用

以前から実行時間を測ったり、再帰関数のキャッシュ(lru_cache from functools)で使用していたが、改めて便利だなあと。

def move_cfd(func):
    def wrapper(*args, **kwargs):
        cfd = Path(__file__).parent
        cwd = Path.cwd()
        os.chdir(cfd)
        res = func(*args, **kwargs)
        os.chdir(cwd)
        return res
    return wrapper

でデコレートしてしまえば、関数の実行時だけ一時的にソースファイルのディレクトリに移動してファイル操作などした後、関数を抜けると元のディレクトリに戻るという操作を追加できる。

コネクトフォーAIの作成

時間かけて10手近く読んだものサンプリングして、ニューラルネットワーク機械学習させて強力なAIを作ろうと思ったが、3手先読まれただけで一勝もできなかった。

読みが深ければ強いというわけでもなく、3手読みのAIが1手読みのAIに負けたりするから「強いって何だよ」状態。

実装に使用したアルゴリズムはアルファベータ法。