Модель одного нейрона

23 марта 2021, автор: Елена Позднякова
Пишем один нейрон с нуля без навыков программирования.
Функционал нейрона: базовые логические операции (конъюнкция, дизъюнкция, отрицание).
Язык: JavaScript (знание не требуется, в процессе всё объясню).
Программа для написания кода: обычный блокнот.
Выполнение команд: любой браузер.
Обучение нейрона: дельта метод.

Оглавление:

Модель логического нейрона "Конъюнкция, дизъюнкция, отрицание"

Массив входящих х:
х1 - логический, может принимать значение 1(истина)/0(ложь);
х2 - логический, может принимать значение 1(истина)/0(ложь)

Функция "Предсказание нейрона":
1) сумматор: произведения всех входящих иксов на их веса
x1*w1+ x2*w2
2) функция активации: пороговая
если полученное значение больше или равно единице, результат =1, иначе =0.

Таблицы истинности:

Первый скрипт:

Или создайте пустой текстовый документ, измените расширение с txt на html, затем откройте файл с помощью блокнота и вставьте в него этот текст:

<!DOCTYPE html>
<head>

  <title>Первый скрипт</title>

</head>
<body>

  <script>



  </script>

</body>
</html>
Между тегами <script> </script> мы будем писать код на языке JavaScript.

JavaScript на один нейрон:

Это минимальный набор конструкций и ключевых слов языка программирования JavaScript, который нам необходим для написания одного нейрона.
JavaScript на один нейрон 2021

Полный текст кода с комментариями:


<!DOCTYPE html>
<head>

<title>Модель одного нейрона</title>

</head>
<body>
Подробное описание этого кода в статье
 <a href='https://megabyte.ga/na-puti-k-nejroseti/model-odnogo-nejrona' target='_blank'> МОДЕЛЬ ОДНОГО НЕЙРОНА </a>

<script>
//   Модель логического нейрона "Конъюнкция, дизъюнкция, отрицание"

//Константы:
const n = 2; //число входящих сигналов х
/*
Массив входящих х:

х1 - логический, может принимать значение 1(истина)/0(ложь);
х2 - логический, может принимать значение 1(истина)/0(ложь)
*/

/*ДАННЫЕ ДЛЯ ОБУЧЕНИЯ training set
------!!!!!! Подключить ТОЛЬКО ОДНУ нужную выборку:
*/
//Обучающий массив КОНЪЮНКЦИЯ, x1 ∧ x2:
//const trainingSet = [[1,1,1],[1,0,0],[0,1,0],[0,0,0]];
//Обучающий массив ДИЗЪЮНКЦИЯ, x1 ∨ x2:
//const trainingSet = [[1,1,1],[1,0,1],[0,1,1],[0,0,0]];

//Более сложные операции
//Обучающий массив КОНЪЮНКЦИЯ отрицания Х1 И Х2, ¬x1 ∧ x2:
//const trainingSet = [[1,1,0],[1,0,0],[0,1,1],[0,0,0]];
//Обучающий массив КОНЪЮНКЦИЯ Х1 И отрицания Х2, x1 ∧ ¬x2:
//const trainingSet = [[1,1,0],[1,0,1],[0,1,0],[0,0,0]];

//----------------------!!! Просто справочно, потому что на одном нейроне xor не работает:
//Обучающий массив XOR (исключающее ИЛИ), x1 ⊕ x2:
const trainingSet = [[1,1,0],[1,0,1],[0,1,1],[0,0,0]];
//Разложение XOR на простые операции:    x1 ⊕ x2 = ( ¬x1 ∧ x2 ) ∨ ( ¬x2 ∧ x1 )

//Переменные
let w = [ ],    //массив весов
  t = 0.3; //скорость обучения

//Функция "Инициализация входящих весов"
function ini( ){
  for (let i=0;i<n;i++)
  {w[i] = Math.trunc (Math.random()*100)/100
  }
return w}

/*Функция "Предсказание нейрона":
1) сумматор:  произведения всех входящих иксов на их веса
x1*w1+ x2*w2
2) функция активации: пороговая
если полученное значение больше или равно единице, результат =1, иначе =0.
*/
function predict (x){
let summator = x[0]*w[0]+x[1]*w[1];
let y = (summator>=1) ?1:0;
return y
}

//Обучение нейрона:
function train () {
for (let i=0;i<trainingSet.length;i++)//Цикл: перебираем примеры обучающей выборки
// d-ошибка i-го примера
{let d = trainingSet[i][2] - predict([trainingSet[i][0],trainingSet[i][1]])
if (d!=0) {
//если ответ не правильный:
w[0]=w[0]+d*trainingSet[i][0]*t; //корректировка веса w1
w[1]=w[1]+d*trainingSet[i][1]*t; //корректировка веса w2
} // конец если
} // конец цикла
} // конец функции


//Проверка всех примеров
function checkAll () {
for (let i=0;i<trainingSet.length;i++)//Цикл: перебираем примеры обучающей выборки
// d-ошибка i-го примера
{let d = trainingSet[i][2] - predict([trainingSet[i][0],trainingSet[i][1]])
console.log(`Пример с индексом ${i} - ${  (d==0)?'правильно':'ошибка'}`);

}
}

/*Справочно: обучение в командной строке:
for (let i=0; i<100; i++) {train()}
*/

</script>

</body>
</html>


Задания для самостоятельной работы:

1
Написать функцию, которая присваивает w1 и w2 случайные веса.
2
Написать функцию, которая делает проверку сразу всех примеров учебного набора с текущим весами.
3
Со случайными стартовыми весами обучить нейрон дельта методом для следующих операций:
КОНЪЮНКЦИЯ,
ДИЗЪЮНКЦИЯ,
XOR,
КОНЪЮНКЦИЯ ОТРИЦАНИЯ Х1 И Х2,
КОНЪЮНКЦИЯ Х1 И ОТРИЦАНИЯ Х2

Составить отчет по результатам: название операции, стартовые веса, точность модели на старте (сколько ошибок), скорость обучения, возможно ли обучить нейрон для получения 100%-ной точности, сколько эпох потребовалось, итоговые веса.
Для какой из приведенных логических операций не получится обучить нейрон и почему?
4
Изменить кодировку данных и функцию активации.
Новые параметры:
1 - истина, -1 - ложь.
Функция активации: пороговая
если полученное значение больше 0, результат =1, иначе =-1.

Со случайными стартовыми весами обучить нейрон дельта методом для следующих операций:
КОНЪЮНКЦИЯ.

Возможно ли обучить нейрон с указанными параметрами дельта методом и какой коэффициент скорости обучения потребуется установить?
Возможно ли подобрать веса для данной операции без машинного обучения?
5
Добавить еще один вход данных на нейрон (на дополнительный вход всегда приходит единица, это аналог нейрона смещения). Потребуется переписать все функции.
Получится ли теперь дельта методом обучить нейрон с параметрами из задания 4?

Дополнительные материалы и ссылки:

JavaScript на одном листе

JavaScript

Учебник по JavaScript

Полный курс по JavaScript за 6 часов
от Владилена Минина