lossの値が急に大きくなった
学習が発散した可能性
- 学習率(learning rate)が高すぎる
学習が収束しない
- 学習率(learning rate)が低すぎる
- データに元々特徴がない(⇒まずはmodelが正しいか、確実に法則のある恣意的なデータで実験)
- データに外れ値が存在する(yが1.1, 1.0, 1.2...辺りで遷移しているところに突発的に100とか来る)
- データの正規化を行う
- データの正則化を行う
- 意図的に訓練データから削除しておく
- 入力と出力の特徴がある程度わかっているのならば、あらかじめわかっている特徴に加工して入力を与える
例)入力が数値の推移で、出力が数値の推移変化の場合入力としても数値の推移変化を与えてあげたほうが良い
参考:https://playground.tensorflow.org/
データが円形になるとある程度分かっている場合はX^2のデータを与えたほうが圧倒的に早く収束する
- 場合によってはlossは下がり切らなくても良い(極端な例外値が含まれるデータにおいてdropout/正規化した場合lossの値は減らないが例外値以外では正常に動作する場合もある)
訓練時はlossの値が低いのに、テストや本番時には高い
過学習(Over Fitting)
- epochをさげて、学習データを増やす
- dropoutの追加を検討/dropのパラメータを強めに
- 正則化(Regularization)を検討
出力がすべて同じ値に
UnderFittng
- dropoutの値を弱めに
- 正則化の値を弱めに
- 学習を多めに
- 学習データ数を多めに
- ShuffleをTrueにするのも多少の効果あり
- 勾配消失問題の可能性?
- activationをreluにする
lossがNaN
https://qiita.com/Ryu_long/questions/bb447bc0f8726e7043df
でご質問いただいたものを回答した内容
- 入力の絶対値が大きい可能性
- 正規化、標準化の検討(入力の絶対値が大きくて計算過程でNaN化している場合)
単純に割り算を入れて小さい値にしたり。
(x - x.mean()) / x.std())
等の式を入れたり。※ただしこれだと外れ値の影響を受けやすくなる
sklearnで
- 正規化、標準化の検討(入力の絶対値が大きくて計算過程でNaN化している場合)
#最大値最小値スケーリング
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
X_train_scaled = scaler.fit_transform(X_train)
# 標準化
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
#レイヤ側で(keras
normalizer = Normalization(axis=-1)
normalizer.adapt(X_train)
model = Sequential([
normalizer, # 正規化レイヤ
....
])
- 0除算などにより次の層への入力がinfになった
- clippingを使って0になりそうなときは小さいサイズに修正(1e-9は適当に設定した小さい値)
hogehoge / (tf.clip_by_value(【0になりそうな式】, 1e-9, 1.0))
- clippingを使って0になりそうなときは小さいサイズに修正(1e-9は適当に設定した小さい値)
対処方法がおかしかったり、他にもあるあるのトラブルありましたら是非コメントください。
これ系にハマると結構時間とられますので、あるあるがあるとすごい助かります。