Недавно я нашел мастера на Bilibili, который реализовал машинное обучение всего с 10 строками кода, что меня действительно поражает.посмотреть видео нажмите здесь
Ниже приводится краткое изложение моего обучения.
Начинать
Сяоцян пойдет в кино?
Рухуа, Сяоцянь, Сяомин и Сяоцян — хорошие друзья и часто вместе ходят в кино. Но Сяоцян не ходит туда каждый раз.Ситуация их первых четырех встреч в кино выглядит следующим образом: (1 означает ходить в кино, 0 означает не ходить в кино)
цветочный | Сяоцянь | Сяо Мин | таракан |
---|---|---|---|
1 | 0 | 1 | 1 |
1 | 1 | 0 | 1 |
0 | 0 | 1 | 0 |
0 | 1 | 0 | 0 |
Если Сяоцянь и Сяомин собираются в пятый раз посмотреть фильм, если цветы не пойдут, пойдет ли Сяоцян?
цветочный | Сяоцянь | Сяо Мин | таракан |
---|---|---|---|
1 | 0 | 1 | 1 |
1 | 1 | 0 | 1 |
0 | 0 | 1 | 0 |
0 | 1 | 0 | 0 |
0 | 1 | 1 | ? |
Наш человеческий мозг анализирует приведенные выше данные, и легко увидеть, что Сяоцян интересуется Жухуа.Сяоцян не пойдет.
Как процесс мышления и анализа человеческого мозга может быть преобразован компьютером в мышление?
код выше
from numpy import array, exp, random, dot
X = array([[1,0,1],[1,1,0],[0,0,1],[0,1,0]])
y = array([[1,1,0,0]]).T
random.seed(1)
weights = 2 * random.random((3,1)) - 1
for _ in range(10000):
output = 1/(1+exp(-dot(X, weights)))
error = y - output
delta = error * output * (1-output)
weights += dot(X.T, delta)
p = 1/(1+exp(-dot([[1,0,0]], weights)))[0][0]
print("小强去不去:", "不去" if p > 0.5 else "去")
Ровно 10 строк, не считая кода для печати. Если вы редко используете Python для научных вычислений, вы можете быть немного обмануты.Не волнуйтесь, ниже я объясню каждую строку кода.
импортировать библиотеку классов
from numpy import array, exp, random, dot
Можно сказать, что Numpy является краеугольным камнем научных вычислений в Python, и его очень удобно использовать. Для удобства математического расчета мы в основном импортируем array, exp, random, dot
- массив: создать матрицу
- exp: Экспоненциальная функция к основанию естественной константы e
- random: генерировать случайные числа от 0 до 1
- точка: умножение матриц
Генерация данных
X = array([
[1,0,1],[1,1,0],[0,0,1],[0,1,0]
])
y = array([[1,1,0,0]]).T
Сгенерируйте код для данных четырех человек, встречающихся для просмотра фильма в таблице выше, обратите внимание, что есть.T
Это означает транспонирование, которое преобразует вектор-строку в вектор-столбец следующим образом:
[ [
[1,0,1], [1],
[1,1,0], [1],
[0,0,1], [0],
[0,1,0], [0],
] ]
Генерация случайных весов
# 设置随机因子,让每次生成的随机数都一样,方便代码调试。
random.seed(1)
# 生成一个范围为 -1 ~ 1,3列的行向量。
weights = 2 * random.random((3,1))-1
Зачем устанавливать вес?
В качестве примера возьмем просмотр фильма в первый раз, [1,0,1] соответствует [1], и между ними существует определенная связь, а именно:
1*w1 + 0*w2 + 1*w3 = 1
w1
,w2
,w3
, который представляет вес.
если мы сможем найтиw1
,w2
,w3
, можно ли подставить в пятый раз ([0,1,1]), чтобы узнать, ходит ли Сяоцян в кино.
0*w1 + 1*w2 + 1*w3 = 小强去吗?
Как набрать вес?
Трудно заменить вес первой части данных на следующие три части данных.
Таким образом, мы случайным образом задаем набор весов, подставляем каждый набор данных, получаем ошибку, а затем изменяем вес, чтобы получить новую ошибку, и так далее, пока ошибка не будет минимизирована.Мы называем этот процесс машинным обучением
Веса оптимизации
for _ in range(10000):
# 用 sigmoid函数将计算结果进行转换
output = 1/(1+exp(-dot(X, weights)))
# 用真实值减去计算结果求出误差
error = y - output
# 计算增量
delta = error * output*(1-output)
# 得到新的权重
weights += dot(X.T, delta)
Повторите цикл 10 000 раз, чтобы ошибка была меньше, и, наконец, получите оптимальный вес.Подставив вес в данные пятого раза, можно рассчитать, пойдет Сяоцян в кино или нет.
Зачем использовать сигмовидную функцию?
Поскольку диапазон результата расчета находится в диапазоне от положительной бесконечности до отрицательной бесконечности, для преобразования его в 0~1 используется сигмоидальная функция, что удобно для классификации.
Как рассчитать прибавку?
delta = error * output*(1-output)
Разделите приведенное выше предложение на две строки кода для лучшего понимания:
# 计算斜率,也就是对计算结果进行求导
slope = output*(1-output)
# 基于 error 计算出 delta,用于更新权重
delta = error * slope
Что такое наклон?
Так как результат расчета преобразуется в гладкую кривую от 0 до 1 по сигмовидной функции. Если ошибка меньше, результат расчета должен приближаться к 0 или 1 без проводов, и чем ближе он к 0 или 1, тем меньше наклон
Зачем умножать ошибку на наклон?
В градиентном спуске чем ближе к оптимальной точке, тем меньше наклон, поэтому там, где наклон наименьший, мы хотим уменьшить изменение дельты, чтобы не пропустить оптимальную точку.
результат прогноза
p = 1/(1+exp(-dot([[1,0,0]], weights)))[0][0]
print("小强去不去:", "不去" if p > 0.5 else "去")
// => 不去
Подставьте веса после 10 000 оптимизаций в [1, 0, 0] для вычисленияp
за0.9999253713868242
, больше 0,5 и бесконечно близко к 1, поэтому Сяо Мин пойдет в кино.
Суммировать
Выше приведена интерпретация всех 10 строк кода.
Чтобы свести к минимуму требуемую экспертизу, эти 10 строк кода не учитывают локальные оптимумы и не учитывают сходимость результатов вычислений, поэтому код недостаточно строгий, но его достаточно, чтобы отразить весь механизм работы машинного обучения. .
С помощью этих 10 строк кода вы можете увидеть, как машина имитирует человеческое обучение, то есть путем непрерывных проб и ошибок, непрерывных исправлений и, наконец, правильного решения.
Наконец, большое спасибо автору видео, видео действительно хорошо сделано, что делает малоизвестный контент таким простым для понимания. Настоятельно рекомендую посмотреть.Говоря о нейросети, 10 строк кода не настраивают пакет, я не понимаю, вы меня ударили!