目次
1 Yogi最適化アルゴリズムの概要
1.1 Yogi最適化アルゴリズムとは
1.2 Yogi定義
2. 実験
2.1 データロード
2.2 データ前処理
2.3 Yogi最適化アルゴリズムのモデル作成
2.4 Adam最適化アルゴリズムのモデル作成
2.5 まとめ
1 Yogi最適化アルゴリズムの概要
1.1 Yogi最適化アルゴリズムとは
yogiは適応勾配の最適化アルゴリズムであり、ミニバッチサイズを大きいときでも収束が速いと言われておりり、非収束の問題を回避する方法です。
ADAMは、学習率が急速に低下しないようにしながら、適応勾配を使用することです。 これを実現するために、ADAMは本質的に乗法であるEMAを使用します。 これは、過去の勾配がかなり速く忘れられる状況につながります。Yogiは制御された実効学習率の増加を採用することにより、パフォーマンスを向上させています。
MNISTデータの実験から、yogiはより良いパフォーマンスを示しています。
論文:Adaptive Methods for Nonconvex Optimization
https://papers.nips.cc/paper/8186-adaptive-methods-for-nonconvex-optimization.pdf
Tensorflow: https://www.tensorflow.org/addons/api_docs/python/tfa/optimizers/Yogi
PyTorch: https://pytorch-optimizer.readthedocs.io/en/latest/_modules/torch_optimizer/yogi.html
TensorflowのYogi最適化アルゴリズムは下記のパラメータになります。
yogi = tfa.optimizers.Yogi( learning_rate = 0.01, beta1 = 0.9, beta2 = 0.999, epsilon = 0.001, l1_regularization_strength = 0.0001, l2_regularization_strength = 0.0001, initial_accumulator_value = 1e-06, activation = ‘sign’, name = ‘Yogi’, ) |
learning_rate | 学習率 |
beta1 | 一次モーメント推定値の指数関数的減衰率 |
beta2 | 二次モーメント推定値の指数関数的減衰率 |
epsilon | 適応性とノイズトレードオフ値 |
l1_regularization_strength | L1正則化 |
l2_regularization_strength | L2正則化 |
initial_accumulator_value | 初期アキュムレータ値 |
activation | sign(強い) とtanh(弱い) 選べる |
name | オペレーション名 |
2. 実験
データセット:cifar10: 60000枚の32ピクセルx32ピクセルの画像。10クラス([0] airplane (飛行機)、[1] automobile (自動車)、[2] bird (鳥)、[3] cat (猫)、[4] deer (鹿)、[5] dog (犬)、[6] frog (カエル)、[7] horse (馬)、[8] ship (船)、[9] truck (トラック))
モデル:CNN Ranger最適化アルゴリズム(TensorFlowアドオン)vs CNN Adam最適化アルゴリズム
TensorFlow 2.0では、TensorFlowアドオンと呼ばれるSpecial Interest Group(SIG)を作成しました。アドオンを使用すると、Rangerのの最適化アルゴリズムを使えるようにします。
!pip install tensorflow-addons |
ライブラリのインポート
import tensorflow as tf import tensorflow_addons as tfa
from keras.datasets import cifar10 import matplotlib.pyplot as plt |
2.1 データロード
keras.datasetsからcifar10のデータセットを読み込みます。
# Splite train and test data (X_train, y_train), (X_test, y_test) = cifar10.load_data()
# setting class names class_names=[‘airplane’, ‘automobile’ ,’bird’, ‘cat’, ‘deer’, ‘dog’, ‘frog’, ‘horse’, ‘ship’, ‘truck’] |
サンプル画像データを表示します。
# show sample image
def show_img (img_no): plt.imshow(X_train[img_no]) plt.grid(False) plt.xticks([]) plt.yticks([]) plt.xlabel(“Label: ” + str(y_train[img_no][0])+ ” ” + class_names[y_train[img_no][0]]) plt.show()
show_img(1) |
2.2 データ前処理
データを正規化します。
# Normalize X_train=X_train/255.0 X_test=X_test/255.0
print(‘X_train shape:’, X_train.shape) print(‘X_test shape:’, X_test.shape) |
X_train shape: (50000, 32, 32, 3)
X_test shape: (10000, 32, 32, 3)
2.3 Yogi最適化アルゴリズム
yogi = tfa.optimizers.Yogi( learning_rate = 0.01, beta1 = 0.9, beta2 = 0.999, epsilon = 0.001, l1_regularization_strength = 0.0001, l2_regularization_strength = 0.0001, initial_accumulator_value = 1e-06, activation = ‘sign’, name = ‘Yogi’, ) |
Yogi最適化アルゴリズムのCNNモデルを作成します。
from keras.models import Sequential from keras.layers import Conv2D, MaxPool2D, Flatten, Dense
model = Sequential() model.add(Conv2D(filters=32, kernel_size=(3, 3), activation=’relu’, input_shape=(32, 32, 3))) model.add(MaxPool2D()) model.add(Conv2D(filters=64, kernel_size=(3, 3), activation=’relu’)) model.add(MaxPool2D()) model.add(Flatten()) model.add(Dense(10, activation=’softmax’))
model.compile(optimizer=yogi, loss=tf.keras.losses.SparseCategoricalCrossentropy(), metrics=[‘accuracy’]) print(model.summary()) |
Model: “sequential_11”
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
conv2d_22 (Conv2D) (None, 30, 30, 32) 896
_________________________________________________________________
max_pooling2d_22 (MaxPooling (None, 15, 15, 32) 0
_________________________________________________________________
conv2d_23 (Conv2D) (None, 13, 13, 64) 18496
_________________________________________________________________
max_pooling2d_23 (MaxPooling (None, 6, 6, 64) 0
_________________________________________________________________
flatten_11 (Flatten) (None, 2304) 0
_________________________________________________________________
dense_11 (Dense) (None, 10) 23050
=================================================================
Total params: 42,442
Trainable params: 42,442
Non-trainable params: 0
_________________________________________________________________
None
モデルを学習します。
history = model.fit(X_train, y_train, batch_size=100, epochs=50, verbose=1, validation_data=(X_test, y_test)) |
Epoch 1/50
500/500 [==============================] – 4s 5ms/step – loss: 1.8444 – accuracy: 0.3276 – val_loss: 1.3881 – val_accuracy: 0.5190
…
Epoch 50/50
500/500 [==============================] – 2s 5ms/step – loss: 0.8413 – accuracy: 0.7090 – val_loss: 1.0337 – val_accuracy: 0.6508
モデル評価
Yogiの最適化アルゴリズムは良い結果になります。
# plotting the metrics
plt.plot(history.history[‘accuracy’]) plt.plot(history.history[‘val_accuracy’]) plt.title(‘model accuracy’) plt.ylabel(‘accuracy’) plt.xlabel(‘epoch’) plt.title(“‘CNN: optimizers=’Yogi'”) plt.legend([‘train’, ‘test’], loc=’lower right’) plt.show() |
from sklearn.metrics import accuracy_score
y_pred = model.predict_classes(X_test) acc_score = accuracy_score(y_test, y_pred) print(‘Accuracy on test dataset:’, acc_score) |
Accuracy on test dataset: 0.6508
2.4 Adam最適化アルゴリズムのモデル作成
Adam最適化アルゴリズムのCNNモデルを作成します。
from keras.models import Sequential from keras.layers import Conv2D, MaxPool2D, Flatten, Dense
model = Sequential() model.add(Conv2D(filters=32, kernel_size=(3, 3), activation=’selu’, input_shape=(32, 32, 3))) model.add(MaxPool2D()) model.add(Conv2D(filters=64, kernel_size=(3, 3), activation=’selu’)) model.add(MaxPool2D()) model.add(Flatten()) model.add(Dense(10, activation=’softmax’)) model.compile(optimizer=’adam’, loss=tf.keras.losses.SparseCategoricalCrossentropy(), metrics=[‘accuracy’]) print(model.summary())
|
Model: “sequential_2”
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
conv2d_4 (Conv2D) (None, 30, 30, 32) 896
_________________________________________________________________
max_pooling2d_4 (MaxPooling2 (None, 15, 15, 32) 0
_________________________________________________________________
conv2d_5 (Conv2D) (None, 13, 13, 64) 18496
_________________________________________________________________
max_pooling2d_5 (MaxPooling2 (None, 6, 6, 64) 0
_________________________________________________________________
flatten_2 (Flatten) (None, 2304) 0
_________________________________________________________________
dense_2 (Dense) (None, 10) 23050
=================================================================
Total params: 42,442
Trainable params: 42,442
Non-trainable params: 0
_________________________________________________________________
None
モデルを学習します。
history = model.fit(X_train, y_train, batch_size=100, epochs=50, verbose=1, validation_data=(X_test, y_test))
|
Epoch 1/50
500/500 [==============================] – 3s 5ms/step – loss: 1.7548 – accuracy: 0.3765 – val_loss: 1.3548 – val_accuracy: 0.5202
…
Epoch 50/50
500/500 [==============================] – 2s 5ms/step – loss: 0.4620 – accuracy: 0.8419 – val_loss: 1.3445 – val_accuracy: 0.6396
モデル評価
# plotting the metrics
plt.plot(history.history[‘accuracy’]) plt.plot(history.history[‘val_accuracy’]) plt.title(‘model accuracy’) plt.ylabel(‘accuracy’) plt.xlabel(‘epoch’) plt.title(“‘CNN: optimizers=Adam'”) plt.legend([‘train’, ‘test’], loc=’lower right’) plt.show()
y_pred = model.predict_classes(X_test) acc_score = accuracy_score(y_test, y_pred) print(‘Accuracy on test dataset:’, acc_score) |
y_pred = model.predict_classes(X_test) acc_score = accuracy_score(y_test, y_pred) print(‘Accuracy on test dataset:’, acc_score) |
Accuracy on test dataset: 0.6396
2.5 まとめ
cifar10データセットでYogi最適化アルゴリズムのCNNモデルとAdam最適化アルゴリズムのCNNモデルを作成しました。Yogiは過学習しにくいと思いますが、不安定の結果になりました。パラメータを変更すれば、より良いモデルができるかもしれません。
担当者:HM
香川県高松市出身 データ分析にて、博士(理学)を取得後、自動車メーカー会社にてデータ分析に関わる。その後コンサルティングファームでデータ分析プロジェクトを歴任後独立 気が付けばデータ分析プロジェクトだけで50以上担当
理化学研究所にて研究員を拝命中 応用数理学会所属