В этой статье основное внимание уделяется обсуждению возможности подбора модели. Способность к переоснащению и обобщению будет обсуждаться в следующей статье.
В принципе, процесс обучения модели нейронной сети на самом деле заключается в подборе математической функции f(x), которая может отображать распределение данных (x) в выходной сигнал (y), и соответствие зависит от данных и модели. Итак, как улучшить способность установки? Начнем с того, почему знаменитая однослойная нейронная сеть не подходит для функции XOR.
1. Дефекты однослойной нейронной сети
Такие модели, как однослойные нейронные сети, такие как логистическая регрессия и перцептроны, по существу являются обобщенными линейными классификаторами (границы решений линейны). Это видно из решающей функции модели логистической регрессии, решающей функции Y=сигмоид(wx+b), когда wx+b>0, Y>0,5; когда wx+b
Это также выявляет недостаток линейных моделей — невозможность использовать нелинейную информацию о взаимодействиях между переменными. Это приводит к известной в истории проблеме xor:
В 1969 году Марвин Мински, представитель «символизма», предложил проблему XOR: xor — это функция операции XOR, ввод двух логических значений (значение 0 или 1), когда эти два значения различны. 1, иначе вывод равен 0. Как показано на рисунке ниже, видно, что данные XOR не могут быть правильно выделены границей линейной модели.
Из-за линейности однослойной нейронной сети даже простая нелинейная функция XOR не может быть изучена правильно, и мы часто надеемся, что модель сможет изучить нелинейную функцию, что нанесло тяжелый удар по исследованиям нейронной сети. год отлива.
Возьмите код логистической регрессии в качестве примера, чтобы попытаться изучить функцию XOR:
# 生成xor数据
import pandas as pd
xor_dataset = pd.DataFrame([[1,1,0],[1,0,1],[0,1,1],[0,0,0]],columns=['x0','x1','label'])
x,y = xor_dataset[['x0','x1']], xor_dataset['label']
xor_dataset.head()
from keras.layers import *
from keras.models import Sequential, Model
np.random.seed(0)
model = Sequential()
model.add(Dense(1, input_dim=2, activation='sigmoid'))
model.summary()
model.compile(optimizer='adam', loss='binary_crossentropy')
x,y = xor_dataset[['x0','x1']], xor_dataset['label']
model.fit(x, y, epochs=100000,verbose=False)
print("正确标签:",y.values)
print("模型预测:",model.predict(x).round())
# 正确标签: [0 1 1 0] 模型预测: [1 0 1 0]
Результаты показывают, что подгоночная способность линейной модели lr ограничена, и нелинейная функция XOR не может быть изучена. Итак, как решить эту проблему?
##2.Как изучить нелинейную функцию XOR Как упоминалось выше, ключом к изучению нелинейных функций является то, что модель использует нелинейную информацию о взаимодействиях между переменными.
Решение очень понятное, либо мы вручную добавляем в модель какие-то нелинейные признаки на вход (то есть метод генерации признаков).
В противном случае, чтобы увеличить способность модели к нелинейному выражению (т. е. нелинейной модели), модель может добавить некоторые нелинейные интерактивные преобразования ф(х) к функции х самой по себе. Предположим, что исходная линейная модель выражается как f(x;w), а нелинейная модель выражается как f(x, ф(x), w).
2.1 Метод: знакомство с нелинейными функциями
Самая простая идея заключается в том, что мы вручную добавляем некоторые другие нелинейные функции измерения, чтобы улучшить способность модели к нелинейному выражению. Это также отражает важность разработки признаков для модели.Модель в значительной степени представляет собой компромисс между сложными функциями + простыми моделями и простыми функциями + сложными моделями.
# 加入非线性特征
from keras.layers import *
from keras.models import Sequential, Model
from tensorflow import random
np.random.seed(5) # 固定随机种子
random.set_seed(5)
model = Sequential()
model.add(Dense(1, input_dim=3, activation='sigmoid'))
model.summary()
model.compile(optimizer='adam', loss='binary_crossentropy')
xor_dataset['x2'] = xor_dataset['x0'] * xor_dataset['x1'] # 非线性特征
x,y = xor_dataset[['x0','x1','x2']], xor_dataset['label']
model.fit(x, y, epochs=10000,verbose=False)
print("正确标签:",y.values)
print("模型预测:",model.predict(x).round())
# 正确标签: [0 1 1 0] 模型预测: [0 1 1 0]
Правильная метка: [0 1 1 0], предсказание модели: [0 1 1 0], предсказание модели в порядке!
2.2 Метод 2: Глубокая нейронная сеть (MLP)
Возьмем теорему об универсальной аппроксимации: «Если нейронная сеть с прямой связью имеет линейный выходной слой и по крайней мере один скрытый слой с функцией активации любого свойства «сжатия», при условии, что сети дано достаточное количество скрытых единиц, она может с произвольной точностью аппроксимировать любую измеримую по Борелю функцию из одного конечномерного пространства в другое». Короче говоря, нейронная сеть с прямой связью имеет «достаточно глубокие сетевые слои» и «по крайней мере один скрытый слой с функцией активации. слой», который может соответствовать произвольным функциям.
Здесь мы добавляем логистическую регрессию к одному скрытому слою и обновляем его до двухслойной нейронной сети (MLP):
from keras.layers import *
from keras.models import Sequential, Model
from tensorflow import random
np.random.seed(0) # 随机种子
random.set_seed(0)
model = Sequential()
model.add(Dense(10, input_dim=2, activation='relu')) # 隐藏层
model.add(Dense(1, activation='sigmoid')) # 输出层
model.summary()
model.compile(optimizer='adam', loss='binary_crossentropy')
x,y = xor_dataset[['x0','x1']], xor_dataset['label']
model.fit(x, y, epochs=100000,verbose=False) # 训练模型
print("正确标签:",y.values)
print("模型预测:",model.predict(x).round())
Правильная метка: [0 1 1 0] , предсказание модели: [[0.][1.][1.][0.]], предсказание модели в порядке!
2.3 Метод 3: Функция ядра машины опорных векторов
Метод опорных векторов (SVM) можно рассматривать как усовершенствование на основе однослойной нейронной сети со скрытым слоем (на конкретный принцип SVM можно обратить внимание в специальном введении автора позже).Для линейных неразделимых задач он отличается от увеличения глубокой нейронной сети.Линейный скрытый слой, SVM использует нелинейную функцию ядра, которая по существу реализует нелинейное преобразование пространства признаков и улучшает способность нелинейного выражения модели.
from sklearn.svm import SVC
svm = SVC()
svm.fit(x,y)
svm.predict(x)
Правильная метка: [0 1 1 0] Прогноз модели: [[0.][1.][1.][0.]], прогноз модели в порядке!
резюме
В конечном счете, модель машинного обучения можно рассматривать как функцию, и основная возможность состоит в том, чтобы управлять представлением признаков с помощью параметра w, чтобы он соответствовал целевому значению Y, и, наконец, изучать функцию принятия решений f ( x; w ). Ключом к улучшению возможности подбора модели является точное управление и использование нелинейной информации о взаимодействии между функциями для реализации нелинейного преобразования пространства признаков. ** Это может быть конкретно связано со следующими двумя аспектами:
-
С точки зрения данных: создание сложных функций с помощью разработки функций.
-
Аспекты модели: используйте нелинейные сложные модели. Такие как: нейронная сеть с нелинейным скрытым слоем, нелинейная функция ядра svm, естественная нелинейная модель дерева ансамбля. С эмпирической точки зрения лучше выполнять слияние этих разнородных моделей.
В этой статье сначала публикуется «Расширенный алгоритм», а официальный аккаунт читает исходный текст для доступа к статье.Связанный код