機械学習ライブラリ | LAplust

機械学習ライブラリ

投稿日 : 2019年6月22日

筆者 : Koki Tanaka

機械学習

はじめに

 機械学習は一般ではAI(人工知能)と呼ばれたりしていますが、そんな高級なものは私の知る限りではまだ存在しません。便宜上、AIと呼んだりしていますが、それはただの「関数」です。y = f(x) のように、xを入力したらyが出力されたにすぎません。柔軟で汎用的に思考する能力はまだありません。とはいえ、人間も五感による入力を基に出力を決定しているだけですが。。これ以上は哲学的な話になりそうなのでやめておきます(笑)

 今や機械学習も、十分な知識がなくとも実装することが可能な環境が整っています。多くのパッケージ化された機械学習サービスが存在し、それを活用してAIサービスを提供している企業も数多く存在します。パッケージ化された機械学習サービスを使えば、あっという間にAIと呼ばれるものが作れたりします。

私たちの機械学習ライブラリは・・・

 前述したように、あらゆる機械学習ライブラリが存在していますが、自社で実装した機械学習ライブラリでは、それらのサービスは一切使っていません。
 理由は1つです。自分たちで作ってみたかったからです。なんせ、作る前まではAIなんて未知の存在でしたから、単純に「作りたい欲求」を満たしたかったからです(笑)。
 現在、私たちの中には、情報工学やプログラミングを専攻した者は一人もいません。皆、電気回路や無線の専門です。しかし、同じ「物作り」なので基本は一緒です。次章ではその機械学習ライブラリについて簡単に説明します。

機械学習ライブラリについて

 そんなこんなで、既存のライブラリを使わずに、PythonやC#などいくつかの開発言語で実装してみましたが、最終的にはC++に落ち着きました。C/C++は歴史も古く、敷居が高いとは言われますが、C++においては近年も進化を続けています。2020年にはC++20がリリースされる予定です。
 作品の質がプログラマーの腕に大きく依存する言語ではありますが、だからこそ作りがいがあります。というのは個人的な感想ですが、選定理由は3つあります。

1. 高速であること

 まず、高速であることです。ただし、プログラマーの腕に大きく依存します。何も考えずに実装すると、C言語をベースに作られたPythonで実装するよりも低速になってしまいます。Pythonは機械学習ライブラリが充実している上に、NumPyという強力な行列演算ライブラリが備わっていて、高速な演算処理を実現しています。ちゃんと考えて実装すれば、少なくともPythonやRubyなどのインタプリタ型言語より低速になることはありません。私たちの実装したものも、まだまだ改善の余地があります。
 しかし、いくらコンパイラ型言語のC/C++だから高速だといっても、精鋭が集って開発されたPythonの実行速度を上回るのは至難の技です。現に、純粋に私たちの作ったものだけでは、機械学習を実装する上で重要である行列演算処理においてPythonより低速です。それもそのはず、Pythonの行列演算を担うNumPyの高速行列演算も、裏ではFORTRANで記述されたBLASというライブラリがもたらしているからです。
 このBLASがやっていることは、コンピュータ工学の知識がなければ理解できそうになかったので、実装するのは素直に諦めました・・・。私たちの行列演算でも利用させて頂いています。BLAS無しでも動作しますが、BLASを導入するだけで大幅に実行速度が向上します。実際には、BSDライセンスでオープンソースのOpenBLASを導入しています。

BLASのHP: http://www.netlib.org/blas/
OpenBLASのHP: https://www.openblas.net/
参考文献: https://www.morikita.co.jp/books/book/2226

2. カスタマイズ性に富むこと

 次に、カスタマイズ性に富むことです。
 機械学習でもディープラーニングにおいては、様々なアルゴリズムの組み合わせ方によって、パフォーマンスが大きく異なります。これは、アルゴリズムに限らず、扱う浮動小数のデータ型や、生成される擬似乱数の質によっても変わります。
 様々な便利な機能がパッケージ化されていくなかで、実装コストは低減されていくものの、オリジナリティは損なわれていくように感じます。将来的には、オリジナリティこそ価値あるものになると確信していますので、可能な限り「自作」を追求しています。
 また、ハードウェアに実装する際には、消費エネルギーや各モジュールとの通信量など、細かくカスタマイズ出来る必要があります。詳しくは次章で述べますが、私たちにとって「カスタマイズ性」はとっても大きなファクターです。

3. ハードウェアとの親和性

 最後に、ハードウェアとの親和性が高いことです。
 ハードウェアは、人間と直に接する要素になるので、私たちはハードウェアに重きを置いています。どれだけ完成度の高いソフトウェアがあったとしても、ハードウェアとの連携がとれなければ私たちにとっては価値はありません。
 農業は、電子機器にとってはとても過酷な環境で行われています。真夏日だと、ビニールハウス内の温度は50℃を超えますが(実家でゴーヤを栽培していた時に、夏休みの自由研究でビニールハウスの温度変化を計測したことがあります・・・)、周囲の温度が変化すると、電子機器の動作にも影響します。その影響にも対応するためには、ハードウェアを細かくコントロールできるソフトウェアが必要です。
 実際に、身の回りのハードウェアの多くはC/C++が組み込まれています。一般に、ハードウェアで動くソフトウェアを組み込みシステムといいますが、あらゆる家電や乗り物、医療機器など、そのほとんどがC/C++です。

おわりに

 私たちの機械学習ライブラリについて簡単に説明しましたが、私が前職の傍、趣味で実装していたものなので、説明資料が揃っておらず見辛い記事になってしまいました。今後は、本格的な活動になるので、検証結果などを詳細に記録していきたいと思っています。なにより物作りが大好きなチームですので、資料作りに専念しすぎないように注意したいですね(笑)。最も相手に伝わるものは、説明資料よりも、実際に動く「モノ」だと思っています!