今回はニューラルネットワークについて皆様にご紹介いたします。機械学習、ディープラーニング、ニューラルネットワークなどAIのソフトウェアには様々な明確な区分があり、そのうちの一つでもあり、よりAIに特化した先端的な学習方法であるニューラルネットワーク、中にはご存知ない方もいらっしゃるかとも思いますが、本記事を参考に理解していただけると幸いです。

ニューラルネットワークについて

もし皆様が人工知能(AI)の世界に足を踏み入れたばかりなら、ほとんどのツールがPythonで作られているので、Pythonは学ぶのに最適な言語です。ディープラーニングは、データを使って予測を行うための技術で、ニューラルネットワークに大きく依存しています。今日は、ニューラルネットワークをゼロから構築する方法を学びます。

本記事では恒例、自分でニューラルネットワークを構築するのではなく、TensorFlowやPyTorchなどのディープラーニングフレームワークを使用します。とはいえ、ニューラルネットワークの仕組みについてある程度知っておくと、深層学習モデルをよりよく構築するために役立ちます。

本記事のお品書きは

・人工知能とは何か

・機械学習と深層学習の両方が人工知能においてどのような役割を果たしているか

ニューラルネットワークの内部構造

・Pythonを使ってゼロからニューラルネットワークを構築する方法

人工知能の概要

基本的な言葉で言えば、AIを使う目的は、コンピュータに人間のように考えさせることです。AIは目新しいものに思えるかもしれませんが、実はこの分野は1950年代にすでに生まれています。AIを使って数独の問題を解くPythonのプログラムを書く必要があると想像してみてください。それを実現する方法は、条件文を書いて、各位置に数字を配置できるかどうか、制約条件をチェックするしかありません。皆様も問題を解くためにpythonを用いてコンピュータをプログラムしたのですから、すでにAIの応用と言えます

機械学習(ML)や深層学習(DL)も問題解決のためのアプローチです。これらの技術とPythonスクリプトの違いは、MLとDLは定義されたルールの代わりにトレーニングデータを使用することですが、いずれもAIを使って問題を解決するために使用することができます。次のセクションでは、これら2つの技術の違いについて詳しく説明します。

機械学習

機械学習とは、ルールを明示的にプログラミングするのではなく、問題を解決するためにシステムを学習させる手法です。機械学習を使って問題を解決するには、解いた数独のゲームからデータを集め、統計モデルを訓練します。統計モデルとは、ある現象の振る舞いを近似的に表現するために数学的に形式化された方法です。

機械学習の一般的なタスクは、入力と既知の出力を持つデータセットがある場合の教師付き学習です。課題は、このデータセットを使って、入力に基づいて正しい出力を予測するモデルを学習することです。以下の図は、教師あり学習を使ってモデルを学習するためのワークフローです。

学習データと機械学習アルゴリズムの組み合わせにより、モデルが作成されます。そして、このモデルを使って、新しいデータの予測を行うことができます。

注:scikit-learnは、多くの教師あり、教師なしの学習アルゴリズムを提供するPythonの人気機械学習ライブラリです。より詳しく知りたい方は、Split Your Dataset With scikit-learn’s train_test_split()をご覧ください。

教師付き学習タスクの目的は、見たことのない新しいデータを予測することです。そのためには、未経験のデータが訓練データセットの分布と同じような確率分布に従うと仮定します。もし将来、この分布が変わってしまったら、新しい学習データセットを使ってモデルを再学習する必要があります。

フィーチャーエンジニアリング

予測問題は、さまざまな種類のデータを入力にすると難しくなります。数独の問題は、数字を直接扱っているので比較的簡単です。しかし、文の中の感情を予測するモデルを学習する場合はどうでしょうか。また、画像があって、その画像に猫が写っているかどうかを知りたいとしたらどうでしょうか。

入力データの別名は「特徴」であり、生データから特徴を抽出するプロセスが「特徴エンジニアリング」です。様々な種類のデータを扱う際には、そのデータから意味のある情報を抽出するための表現方法を考える必要があります。

特徴量エンジニアリングの一例として、文中の単語から屈折を取り除く「レマタイゼーション」があります。例えば、動詞”watch “の活用形である “watches”、”watching”、”watched “などは、そのオリジナル、つまり基本形に帰着されます。”watch “です。コーパスの各単語を格納するために配列を使用している場合、最終的には、より疎な行列になります。これにより、一部の機械学習アルゴリズムの性能が向上します。次の図は、逆誤差伝搬を用いた、表現のプロセスを示しています。

まず、すべての単語を活用した形がその基本形に還元されます。そして、その単語の出現回数を計算します。その結果、テキスト中のすべての単語の出現回数を含む配列が得られる。

深層学習

深層学習とは、特徴エンジニアリングの技術を適用する代わりに、どの特徴が重要であるかをニューラルネットワークに自分で考えさせる技術です。つまり、深層学習では、特徴量エンジニアリングのプロセスを回避することができるのです。

データセットが複雑になればなるほど、特徴量エンジニアリングのプロセスは難しくなるので、特徴量エンジニアリングを行わなくて済むのは良いことです。例えば、ある人の顔写真から、その人の気分を予測するためのデータをどのように抽出するでしょうか。ニューラルネットワークでは、ニューラルネットワーク自身が特徴を学習するので、心配する必要はありません。次のセクションでは、ニューラルネットワークの仕組みをより深く理解するために、ニューラルネットワークを深く掘り下げていきます。

ニューラルネットワークの 主な概念

ニューラルネットワークとは、次のような手順で予測方法を学習するシステムです。

・入力データを受け取り

・予測の作成

・予測値と目的の出力を比較する

・次回の予測が正しく行われるように内部状態を調整する

ニューラルネットワークを構成する要素には、「ベクトル」「レイヤー」「線形回帰」などがある。データはベクトルとして格納され、Pythonではこのベクトルを配列に格納します。各層は、前の層から送られてきたデータを変換します。各層は、前の層から送られてきたデータの表現を抽出するので、各層を特徴量エンジニアリングのステップと考えることができます。ニューラルネットワークのレイヤーの優れた点は、同じ計算であらゆる種類のデータから情報を抽出できることです。つまり、画像データでもテキストデータでも構わないということです。意味のある情報を抽出し、深層学習モデルを学習させるプロセスは、どちらのシナリオでも同じです。

下の画像では、2つの層を持つネットワークアーキテクチャの例を見ることができます。

各層は、前の層から送られてきたデータを、いくつかの数学的な操作によって変換します。

ニューラルネットワークの学習プロセス

ニューラルネットワークの学習は、試行錯誤のプロセスに似ています。例えば、初めてダーツをするとします。最初の一投目では、ダーツボードの中心点に当てようとします。通常、1投目は手の高さやスピードが結果にどう影響するかを知るために捨て駒で様子見を行います。ダーツが中心点よりも高いことがわかれば、少し低い位置に投げるように手を調整する、といった具合です。

以上が、ダーツボードの中心に当てるための手順です。ダーツがどこに落ちたかを観察して、誤差を評価し続けることに注意してください(ステップ2)。ダーツボードの中心に当たるまで続けるのです。ニューラルネットワークの場合も似たようなもので、ランダムな重みとバイアスのベクトルからスタートし、予測を行い、それを望ましい出力と比較して、次の予測がより正確になるようにベクトルを調整します。このプロセスは、予測値と正しい目標値の差が小さくなるまで続けられます。

トレーニングを停止するタイミングと精度目標を設定することは、主にオーバーフィットとアンダーフィットのシナリオのため、ニューラルネットワークのトレーニングにおいて重要な側面です。

ベクトルと重み

ニューラルネットワークでは、ベクトルを使った演算を行います。ベクトルは多次元の配列として表現します。ベクトルがディープラーニングで有用なのは、主に1つの特殊な演算である「ドット積」のためです。2つのベクトルのドットプロダクトは、2つのベクトルの方向性がどれだけ似ているかを示し、2つのベクトルの大きさでスケール調整されます。

ニューラルネットワークの主なベクトルは、重みとバイアスのベクトルです。大雑把に言うと、ニューラルネットワークにやらせたいことは、ある入力が、すでに見たことのある他の入力と似ているかどうかをチェックすることです。新しい入力が以前に見た入力と類似していれば、出力も類似したものになります。これが、予測という結果を得る方法です。

まとめ

キリの悪いところですが、今回の記事はここまでになります。少し周りくどく定義についてのご紹介をしましたが、エンジニアとしてAI開発に携わる可能性がある方はこういった定義が開発の場での意思疎通や情報交換の効率化においてとても重要な役割を発揮してくれますので是非これを機会にマスターしておきましょう。

次の記事