Я в Termux (планшет, смартфон) пытаюсь понять, как из нескольких строк на чистом Си рождается свободная и не зависимая личность - Нейрон.

Этот проект об искусственном интеллекте, который начался не с установки библиотек, а с чертежа в тетради. Здесь машинное обучение - это не абстрактный термин, а физическая подстройка " Виртуальных резисторов ".

Я нахожусь на периферии трёх миров :

  1. Аналоговой интуиции ( где вес нейрона - переменный резистор ).

  2. Математика ( где ошибка заставляет систему эволюционировать).

  3. Программирование (цель - не просто скрипт в полноценная ОС ).

Итоговая салфетка инженера

Это не просто набросок. Здесь я свёл воедино всё: от физической аналогии с резисторами до математической логики коррекции весов. Именно по этой схеме пишутся мои stand.c и exploitation.c

Стенд

Код открытый, видна каждая шестерёнка. Здесь нет сложных функции всего одна стандартная библиотека.

  1. ANSI - цвет.

  2. Бесконечный цикл while (1) - позволяет проводить серию экспериментов, не перезапуска я программу. Нет защиты от неверного символа. CTRL +C.

  3. Код я оставил максимально чистым. Вся логика в четырёх строках внутри цикла for.

#include <stdio.h>
#define G "\033[32m"
#define Y "\033[33m"
#define S "\033[34m"
#define R "\033[0m"
int main ()
{
        float x1; float w1 = 0.05; float bias = 0.01;
        float sk_obuch; float error; float out;
        float targ; int cikl;

        while (1)
        {
        printf(" Вход  : "); scanf("%f", &x1);
        printf(" Ск_об : "); scanf("%f", &sk_obuch);
        printf(" Цель  : "); scanf("%f", &targ);
        printf(" Цикл  : "); scanf("%d", &cikl);

        for (int i = 0; i < cikl; i ++)
        {
                out = ( x1 * w1 ) + bias;
                error = targ - out;
                w1 += sk_obuch * error * x1;
                bias += sk_obuch * error;

                printf (Y"   %d", i);
                printf (G"  Вес = %.3f"R, w1);
                printf (S"  Bias  = %.3f"R, bias);
                printf (G"   Ошиб  = %4.3f"R, error);
                printf (S"   Out  = %.3f\n"R, out);
        }
        }
        return 0;
}


~

Результат работы в Termux

  • Вес (w) и смещение (b) - это начальное произвольное значение.

  • Вход (x), скорость обучения (s), цель (t), количество интеграцией (i) выбираем через scanf что удобно проводить эксперименты.

  • Вход 10; 5 - веса не стабильны нейрон обучается под одно значение.

  • Драма (внизу) - при слишком высокой скорости обучения веса прыгают и система идёт в разнос.

На скриншоте - два сценария жизни моего нейрона

  1. Стабильность: При низкой скорости обучения (0.01) система плавно гасит ошибку и находит идеальный баланс.

  2. Хаос: Как только я поднял скорость (0.1) нейрон потерял устойчивость. Веса начали прыгать, и система улетела в бесконечность.

  3. Итоги: Этого кода достаточно , чтоб изучать закономерность и управление нейрона. Всего не опишешь. Запуская, меняй значение.

Эксплуатация

Здесь нет ни одной лишней строчки. В режиме эксплуатации нейрон не тратит силы на "раздумья" и обучения - он просто мгновенно выдает результат на основе опыта полученного на стенде.

#include <stdio.h>
int main ()
{
        float w;
        float b;
        float out, input;

        out = (input * w) + b;

        return 0;
}

Практика

Давайте немного попрактикуемся - для примера возьмём чайник. При 100 градусах вода кипит - чайник должен отключиться. Обучим нейрон и получим умный чайник.

  • Цель эксперимента: «Мы научим нейрон распознавать критическую точку — 100 градусов. Входным сигналом будет температура, а целевым значением — сигнал на отключение».

  • Логика: «На этом этапе нейрон ещё "одномерный", но он уже учится принимать решение: пора выключать питание или нет».

Запускаем обучение ( Стенд )

Процесс подстройки весов на стенде. Берём Вес = 0.01 смещение опустим.

Ишим вес
Ишим вес

Раздел работа ( Эксплуатация)

Вес (w) = 0.01, b опустим . Эксплуатация с активацией простейший случай.

#include <stdio.h>
int main ()
{
        float w = 0.01;
        float b = 0.0;
        float out, input;
        int res;
        while (1)
        {
        scanf ("%f", &input);
        out = (input * w) + b;
        res = (out > 1) ? 0 : 1;
        printf("%d\n\n", res);
        }
        return 0;
}

Работа готового нейронного ядра.

20, 56, 74, -20, 99, 100 - это температура воды.

1 - чайник включен.

0 - чайник выключен.

Всё что написано вверху это : итоги

Откуда это всё взялось ? Как я на это вышел ?

  • Я изучал биты, логику, память на Си - учил классику. Потом мне захотелось потрогать современные технологии. Си плюс нейрон вот тебе и современные технологии, вот тебе и современный стэк.

  • Смотреть под капот памяти это сложно, но интересно.

  • Когда я впервые заглянул под капот нейрона : Мне показалось это скучным. Сухая арифметика. Ребята, расходимся - здесь умножение.

  • Решил абстрагироваться : Нейрон это независимая, свободная личность, которая способна учиться. Чему научишь то она и будет уметь.

  • Перспектива: Может жить от одной батарейки годами. Не нужен интернет.

Изначально я вообще ни чего не понял. Взрывал мозги долго и нудно, и все ровно ни чего ни понимал. Пока не включил режим радиолюбителя ( подстроечный, переменный резистор) не то , что бы я понял , но картина начала появляться. Когда я изучал память я до конца так и не понял. Почему адрес должен быть кратен размеру данных ? Нейрон я тоже до конца не понимаю.

запуск сборка

Мой путь и черновики Data7Neuron

https://github.com/Data7Viz/Data7Neuron

Забегая на перёд. Строили бешеные слои абстракций. Разрабатывали супер компьютер. Чтоб снова вернуться к нулям и единицам.

Продолжение следует.........