Потери и точность - это разумные кривые обучения?

Я изучаю нейронные сети и построил простую в Keras для классификации набора данных радужной оболочки глаза из репозитория машинного обучения UCI. Я использовал сеть с одним скрытым слоем и 8 скрытыми узлами. Оптимизатор Adam используется со скоростью обучения 0,0005 и работает в течение 200 эпох. Softmax используется на выходе с потерями в виде катогорико-кроссэнтропии. Я получаю следующие кривые обучения.

Кривая обучения

Как видите, на кривой обучения точности есть много плоских участков, и я не понимаю, почему. Кажется, что ошибка постоянно уменьшается, но точность не увеличивается таким же образом. Что означают плоские области на кривой обучения точности? Почему точность не увеличивается в этих областях, хотя кажется, что ошибка уменьшается?

Это нормально на тренировках или более вероятно, что я здесь что-то делаю не так?

dataframe = pd.read_csv("iris.csv", header=None)
dataset = dataframe.values
X = dataset[:,0:4].astype(float)
y = dataset[:,4]

scalar = StandardScaler()
X = scalar.fit_transform(X)

label_encoder = LabelEncoder()
y = label_encoder.fit_transform(y)

encoder = OneHotEncoder()
y = encoder.fit_transform(y.reshape(-1,1)).toarray()

# create model
model = Sequential()
model.add(Dense(8, input_dim=4, activation='relu'))
model.add(Dense(3, activation='softmax'))

# Compile model
adam = optimizers.Adam(lr=0.0005, beta_1=0.9, beta_2=0.999, epsilon=1e-08, decay=0.0)
model.compile(loss='categorical_crossentropy',
              optimizer=adam, 
              metrics=['accuracy'])

# Fit the model
log = model.fit(X, y, epochs=200, batch_size=5, validation_split=0.2)

fig = plt.figure()
fig.suptitle("Adam, lr=0.0006, one hidden layer")

ax = fig.add_subplot(1,2,1)
ax.set_title('Cost')
ax.plot(log.history['loss'], label='Training')
ax.plot(log.history['val_loss'], label='Validation')
ax.legend()

ax = fig.add_subplot(1,2,2)
ax.set_title('Accuracy')
ax.plot(log.history['acc'], label='Training')
ax.plot(log.history['val_acc'], label='Validation')
ax.legend()

fig.show()

person Ananda    schedule 14.12.2017    source источник


Ответы (1)


Здесь очень поможет небольшое понимание фактического значения (и механики) как потери, так и точности (см. Также это мой ответ, хотя я буду использовать некоторые части повторно) ...

Для простоты я ограничу обсуждение случаем бинарной классификации, но эта идея в целом применима; вот уравнение (логистических) потерь:

введите описание изображения здесь

  • y[i] - настоящие метки (0 или 1)
  • p[i] - это прогнозы (действительные числа в [0,1]), обычно интерпретируемые как вероятности.
  • output[i] (не показан в уравнении) - это округление p[i], чтобы преобразовать их также в 0 или 1; именно эта величина входит в расчет точности, неявно включающий порог (обычно 0.5 для двоичной классификации), так что если p[i] > 0.5, то output[i] = 1, иначе если p[i] <= 0.5, output[i] = 0.

Теперь предположим, что у нас есть истинная метка y[k] = 1, для которой на ранней стадии обучения мы делаем довольно плохой прогноз p[k] = 0.1; затем, подставляя числа в приведенное выше уравнение потерь:

  • вклад этого образца в убыток составляет loss[k] = -log(0.1) = 2.3
  • начиная с p[k] < 0.5, у нас будет output[k] = 0, следовательно, его вклад в точность будет равен 0 (неправильная классификация)

Предположим теперь, что на следующем этапе обучения мы действительно становимся лучше и получаем p[k] = 0.22; теперь у нас есть:

  • loss[k] = -log(0.22) = 1.51
  • поскольку он по-прежнему p[k] < 0.5, мы снова имеем неправильную классификацию (output[k] = 0) с нулевым вкладом в точность

Надеюсь, вы начнете понимать эту идею, но давайте посмотрим еще один снимок позже, где мы, скажем, получаем p[k] = 0.49; тогда:

  • loss[k] = -log(0.49) = 0.71
  • все еще output[k] = 0, т.е. неправильная классификация с нулевым вкладом в точность

Как вы можете видеть, наш классификатор действительно стал лучше в этом конкретном примере, то есть он уменьшился с 2,3 до 1,5 до 0,71, но это улучшение все еще не проявилось в точности, которая заботится только о правильных классификациях < / em>: с точки зрения точности не имеет значения, что мы получаем более точные оценки для нашего p[k], пока эти оценки остаются ниже порогового значения 0,5.

В тот момент, когда наш p[k] превышает порог 0,5, потери продолжают плавно уменьшаться, как это было до сих пор, но теперь у нас есть скачок во вкладе точности этого образца от 0 до 1/n, где n - общее количество выборок.

Точно так же вы можете сами убедиться, что, как только наш p[k] превысит 0,5, что дает правильную классификацию (и теперь положительно влияет на точность), дальнейшие его улучшения (то есть приближение к 1.0) по-прежнему уменьшают потери, но больше не влияют на точность.

Аналогичные аргументы справедливы для случаев, когда истинная метка y[m] = 0 и соответствующие оценки для p[m] начинаются где-то выше порога 0,5; и даже если p[m] начальные оценки ниже 0,5 (следовательно, они обеспечивают правильную классификацию и уже вносят положительный вклад в точность), их сходимость к 0.0 уменьшит потери без дальнейшего повышения точности.

Собирая части вместе, надеюсь, теперь вы сможете убедить себя, что плавно уменьшающиеся потери и более ступенчатое повышение точности не только не несовместимы, но и действительно имеют смысл.


На более общем уровне: со строгой точки зрения математической оптимизации не существует такого понятия, как точность - есть только убытки; Точность обсуждается только с точки зрения бизнеса (а другая бизнес-логика может даже требовать порогового значения, отличного от значения по умолчанию 0,5). Цитата из моего собственного связанного ответа:

Потеря и точность - разные вещи; грубо говоря, точность - это то, что нас действительно интересует с точки зрения бизнеса, в то время как потери - это целевая функция, которую алгоритмы обучения (оптимизаторы) пытаются минимизировать с помощью математического перспектива. Еще более грубо говоря, вы можете думать о потерях как о переводе бизнес-цели (точности) в математическую область, о переводе, который необходим в задачах классификации (в регрессионных задачах обычно потери и бизнес-цель совпадают, или хотя бы может быть таким же в принципе, например RMSE) ...

person desertnaut    schedule 14.12.2017