製品・サービスAIフレームワーク
“ufiesia”“pyaino”
学び、応用できる
2つのAI環境を構築
AIは日々進化し、私たちの生活や仕事に欠かせない存在になりつつあります。
でも、「どう動いているのか分からないまま」使っていませんか?
私は、その仕組みを理解しながら使えるAI環境を作りたいと考えました。
基礎の仕組みをシンプルに学べるufiesiaと、実践的な開発に使えるpyaino。
学びから応用までーAIを「ブラックボックス」から「透明なツール」へ変える2つのフレームワークです。(井上愛一郎)
ufiesia(ウフィーシア)とは
Ufiesiaはニューラルネットワークやディープラーニングの基本構造を理解するために用意したフレームワークです。
ソースコードを見て理解の助けとなるように、内部の記述も出来るだけ平易にしています。
同時に公開した「京」の扉に沿って学習していけば基本的な仕組みの理解が出来るものと期待します。
GitHubより、ufiesia(ウフィーシア)を
ダウンロードいただけます。
pyaino(ピアイノ)とは
pyainoは、NumPyをそのまま活用しながら実践的なAI開発を可能にするディープラーニング・フレームワークです。
微分計算はdefine-by-run方式で提供され、単純な関数の微分から、ディープラーニングの複雑な勾配計算まで正確に実現します。たとえば、1次関数の二階微分が正しくゼロになるように、高階微分も数学的に正確に計算できます。また、行列積の扱いも、数学と同じ規約で行われ、数値計算や数学の素養を持つ方にとって混乱がありません。
画像処理や言語処理に必要なモジュールも備えており、わずか数行の記述で機械学習やディープラーニングを体験できます。加えて、各モジュールは順伝播と逆伝播を明示的に記述しているため、不要な計算グラフを生成せず、計算資源を効率的に利用でき、検証時の動作確認も容易です。
GitHubより、pyaino(ピアイノ)を
ダウンロードいただけます。
AIフレームワーク 開発ブログ 過去の日誌を見る
ニューロン
ブログの更新が滞っていました。でもこの間にもいろいろなことが有りました。そして改めて基本に立ちかえって、書いておきたいことがあるのに気づきました。
きほんって何だっけ?
いつも使っていた図
以下は、講演や社内の研修会の際に、AIやディープラーニングを話題にするときに、いつも使ってきた図です。説明もその図についていたものをそのまま掲載します。

ディープラーニングを担うもの
ニューロンは人間を含む生物の神経細胞の働きを、簡略化して数値計算できるようにしたもの、と言えば良いかと思います。
この入力から出力に至る一連の動作が、生成AIを含むニューラルネットワークを用いたディープラーニングによるAIの基本となっています。いるはずです。
そして脳は、神経細胞が多数集まってネットワークを構成し、大きな塊となって高度な処理を行っていますが、これと同様に、ニューロンもまた、多数集まってネットワークを構成(ニューラルネットワーク)し、高度な機能(ディープラーニング、AI)を発揮しています。
さて先ほど、冒頭でわざわざ「いるはずです」などと言い換えたのは、実はこれが基本と言いながら、実際のニューラルネットワークの多くでは、この図に示すニューロンそのものを1つの基本単位としていない、と言ったら「えっ?」となりませんか?
実は驚くようなことではなくて、重み付け和と活性化関数は別の算数になるから、別にしているだけなのです。
それでも初心者の私には気持ち悪かった。
もともと一つ(そもそもそう考えること自体、こだわりでしかありませんが)のものを分けるだけのことです。しかし小さく分割して最小の、それ以上分けてしまったら、働きを失うものを、分けるのは、細胞は死滅し、分子は別の何かに変りはて、原子核の分裂は世界終末時計を進めますから、空恐ろしいことだと思うのは私だけでしょうか?
初心者向けの実装
もう一つの観点は、やはり分かりやすさを重視する場合です。ニューラルネットワークの基本単位としてのニューロン部分は、次のように実装します。(あくまでもコードイメージですが)
def forward(self, x):
u = np.dot(x, self.w) + self.b # affine
y = self.activator.forward(u) # 活性化関数
return y
これは、先ほどの図そのままの実装となっています。すなわち、1行目が入力(x)の重み付け和affineで、2行目でそれ(u)を活性化関数に入れて、出力(y)します。
1点だけ分かりにくいのは次の点です。実は、この時の入力も出力もスカラー、すなわち、1つの値ではなくて、その集合となっているという点です。すなわち先の図で、2つの入力x1,x2が入力として書かれていますが、この2つをまとめてxとしているのです。そしてさらに、x1、x2にはそれぞれ、ある時はこれ、また別のときはこれというように、複数のケースがあるので、それも併せて、xは2次元の行列となり、yもまた、そのどの場合に対応するかで、複数のケースがあるので、ベクトルや行列になるのです。ややこしいことを書きましたが、神経細胞で樹状突起から複数の信号が神経細胞に入り、入る値は刻々と変化して出力も刻々と変化することと照らし合わせれば同様だといえると思います。むしろちょっとややこしいのは、そういうニューロンを複数個並べても、数式としては同じな点です。入力で複数入力をまとめて扱ったごとく、中間値uや出力yでも、まとめて扱うようにすると、あくまでも1つのニューロンで1本の信号に1つ次元を加えて、ある1つのケースでベクトル、複数ケースで行列ということになります。当然ながら重みself.wやバイアスself.bも複数ニューロンに対応して複数個です。重みself.wに関してはもともと複数の入力のそれぞれに対して1つの重みなので、複数入力で複数個、それがまた複数ニューロン分あるから、やはり、複数×複数の行列となります。
ニューロン層
このように文章で書くとややこしいですが、数式ではむしろ簡単で、行列xと行列self.wの行列積=np.dot()にあとはバイアスself.bを加えるだけとなります。
そしてこの複数入力を同時に複数ニューロンに入れて処理するものを「層」と呼びます。この様子を説明する図がありますので、以下に掲載します。

ufiesiaとpyaino
そうなんです。ufiesiaもpyainoも以上説明してきたことを、そのまま実装しているのです。
ufiesiaでは前後処理などが加えられていますが、Neuron.pyのNeuronLayerを見てもらえば、コードイメージに示した通りとなっているのが、すぐわかると思います。
いっぽうpyainoはもっと複雑です。しかしそれでもニューロンはNeuron.pyにNeuronLayerとして説明してきたとおりの機能を実装しています。
つまらないこだわりのようでも、この基本単位のニューロンは、あくまでも基本単位としておきたかったのです。そうしないと、説明と実装が違ってしまうのは嫌だし、あたかも、同じ元素からできていたとしても別の分子を組み合わせて作られた物体のように見えるのが嫌だったのです。しかしこれが一筋縄ではいかないことに、苦労することになりました。その話はまた近いうちに、と思っています。
ブログのご感想やAIフレームワーク「ufiesia」「pyaino」に関するお問い合わせは、
問い合わせフォームからお送りください。
- お問い合わせ内容によりましては、ご期待に添えない場合やご回答が出来ない事が有ります。