Kaggleの「digit-recognizerコンペ」にシンプルなNNモデルで挑み高精度を出してみた。(文字認識AI)

目次

1.はじめに
2.環境
3.ニューラルネットワークって何?
4.事前準備
5.実装
6.モデルの説明
7.精度
8.まとめ

1. はじめに

みなさんはKaggleというものをご存じでしょうか?
Kaggleは、データサイエンスと機械学習のコミュニティプラットフォームで、世界中の現役のAI開発エンジニアやデータサイエンティストはもちろんのこと、学生や、そこら辺の職種を志望している方などが日々研鑽を積んでいます。

主にKaggleでは以下のような多くの機能を提供しています:

コンペティション(Competition): 企業や研究機関が提供する実際の問題に対して、データサイエンティストが最良のモデルやソリューションを開発するための競技会。優勝者や上位の参加者は賞金や賞品を受け取ることができます。

データセット(Dataset): ユーザーが公開したり、共有したりする様々なデータセットにアクセスすることができます。これは研究や学習、プロジェクトのための素材として非常に役立ちます。

ノートブック(Notebook): ユーザーはKaggle上でJupyterノートブックを作成、実行、共有することができます。これはデータ解析やモデルの構築、学習の過程を他のユーザーと共有するためのものです。

ディスカッション(Disccusion): ユーザーはディスカッションフォーラムで質問をしたり、知識を共有したり、フィードバックを受け取ったりすることができます。

学習: Kaggleは「Kaggle Learn」というプラットフォームも提供しており、これはデータサイエンスの基礎から応用までの短いチュートリアルやコースが含まれています。

さらにKaggleにはそこでの成果に応じて、金・銀・銅の3種類のメダルが付与され、その数に応じてユーザーのランクも設定されます。

■Kaggleのランク
・Grand Master
・Master
・Expert
・Contributer
・Novice

Kaggleのランクは上記のように5つの段階があり、全員Noviceから始まり、Grand Masterが頂点に君臨しています。
KaggleのMasterランクですら、日本では200人程度しかいないとされており、上位ランクへの昇格のしにくさが見て取れます。

さらにこのランクは、上記4つの機能に個別で設定されており、それぞれでランク昇格の条件も異なります。

詳しくはこちら↓
https://www.kaggle.com/progression

2. 環境

PC: MacOS
言語: Python v3.10
GPU: T4 GPU
ライブラリ:
[標準ライブラリ]
なし
[外部ライブラリ]
Matplotlib
Numpy
Sklearn
Pandas
Torch

3. ニューラルネットワークって何?

Neural Network(ニューラルネットワーク)とは、人間の脳の神経細胞の接続に触発されて作られたAIモデルのことで、画像認識から自然言語処理、音声認識まで、様々な分野での応用が広がっています。

ニューラルネットワークの基本知識として、
ニューラルネットワークは、以下の要素から成り立っています。

ニューロン:情報を処理する基本的な単位。
各ニューロンは、複数の入力を受け取り、加重平均を計算した後、活性化関数を適用して出力を生成します。

重みとバイアス:これらは学習の際に調整されるパラメータで、ニューロンの入力とどのように関連するかを決定します。

活性化関数:ニューロンの出力値を制限または変換する非線形関数。例としては、シグモイド関数やTanh関数(ハイパボリックタンジェント関数)などがあります。

ニューラルネットワークの構造:
一般的なニューラルネットワークは、入力層、一つ以上の隠れ層、そして出力層から成り立っています。入力層はデータを受け取り、出力層は最終的な予測や分類の結果を返します。
隠れ層は、複雑なデータの特徴やパターンを捉える役割を果たしています。

ディープラーニング:
多数の隠れ層を持つニューラルネットワークを「ディープニューラルネットワーク」と呼びます。このような深いネットワークは、ディープラーニングとして知られる分野で主に使用されています。

4. 事前準備

kaggle以外で大会用のtrain、testデータを使用する場合はkaggleからローカルにデータを落とさなければならないので、まずはそれを行います。
kaggleで実装する場合は、直接データを使用できるので、特に準備は不要です。

5. 実装

6. モデルの説明

軽く今回作成したモデルの説明をしていきます。


今回のモデルは、2つの畳み込み層と2つの全結合層を組み合わせたシンプルな構造で作成しました。
理由としては、手書き数字の識別には、複雑なネットワーク構造は必要としないからです。
他の理由としては、個人的には、「MNISTのような手書き数字データは、28x28ピクセルのグレースケール画像として提供されており、解像度は低いため、情報の量も限られているから学習しやすい」のと、「分類タスク自体が0~9の数字の10クラスのみであり、多クラスの問題ではないため、出力の複雑性が低いので、小さいモデルでも十分に精度が出せて、逆に複雑なモデルを使用すると過学習に陥ってしまう危険性がある」と考えています。

なので今回は、上記のような簡単なモデルで高い精度が見込めるのではないかと考えました。

7. 精度

学習してみた結果が以下になります。

かなり高精度で学習できているのがわかりますね!
最終的には99.10%とほぼ文句なしの精度になっているので、モデルの作成において間違ってはいなかったことがわかります。

8. まとめ

このように、人工知能というものは、ニューラルネットワークというものを用いて人間の脳をコンピュータ上で再現し、そのネットワークにさまざまなタスクを読み込み学習させ、AIを作っていきます。

世の中に出ているAIプロダクトのほとんどがこの「ニューラルネットワーク」という技術を駆使し作成したプロダクトになっています。

ぜひ、読者の皆様もこれを機に「AI開発」に興味をお持ちになられたら一度ニューラルネットワークを触ってみてください!

SHARE
採用バナー