Sly32

Рейтинг
399
Регистрация
29.03.2012
Должность
Software engineer
ArbNet #:
Мне конечно не интересно на готовом фреймворке, да ещё и на Python.
Сразу 2 почему. Но давай подробнее. У тебя какая цель - практическая или теоретическая? Ты хочешь создать свою модель, которая будет работать или ты просто хочешь процесс ражи процесса?
Что тебя не устраивает в пайтон, кроме того, что ты его не знаешь?
Я уже приводил примеры нейросети на базовых командах - это реально, но очень затратно по времени. Зачкм мне заново реализовавать механизм сложения матриц?  Это математика, я все равно там ничего нового не придумаю. А время убью.
Вот тебе результат первого этапа обучения- на исходных данных в 37 Килобайт. модел уже весит 200 Мегабайт и она все еще крайне слабая. Я попробовал создать mini - получилось 37Мегабайт но выдает полный бред.
Теперь взял такой формат
Формат данных: text
Общий размер текста: 205,312 символов
Токенизатор: 181 токенов
Dataset: 184,780 токенов
Dataset: 20,532 токенов
✅ Train: 184268 окон, Val: 20020 окон
Модель создана: 19,270,144 параметров
Что скажешь - что изменить посоветовал бы?

вот этап тренировки  после 10 минут

Epoch 1/5:   9%| | 499/5759 [12:14<1:15:44,  1.16it/s, loss=2.5536, ppl=12.85, lr=3.💾 save_checkpoint: подготовка данных...
💾 save_checkpoint: сохранение в checkpoints/python_model_step_500.pt...
✓ save_checkpoint: файл сохранен (220.6 MB)
Epoch 1/5:  10%| | 599/5759 [13:40<1:15:20,  1.14it/s, loss=2.4275, ppl=11.33, lr=3.
То есть еще все очень плохо. Жаль не сохранил ответ старой модели.
Для теста возьму стандартеые вопросы по пайтону и буду их задавать генератору

Есть какие-то советы из того, что ты уже изучил.  от тебя интересует оптимизация обучения и размеров - вроде как именно это тебя не устраивало больще всего.

Размеры я привел, если нужны еще какие-то параметры - спрашивай


Спор с Арбнет иногда приводит к неожиданным результатам. Захотелось на практике попробовать  создать и натренировать свою модель, узко специализированную и понять - есть ли в этом смысл. Недостатки и достоинства мы примерно знаем. Главная идея - делегировать узкие задачи своей модели и не тратить на это токены. 

Дальше можно не читать, кому эта тема неинтересна. И вопрос к владельцам топика - Александру и Алексею - вы не против моих постов тут на эту тему? По факту это тоже челлендж. Неохота плодить темы и тут уже есть контекст, полезный для понимания разговора. Тема про ИИ слишком широкая, к тому же загажена изрядно флудерами.

Суть идеи - создать свою LLM, которая сможет работать на ограниченных ресурсах с приемлемым результатом. 

Я не претендую на оригинальность. Поэтому просто взял существующий фреймворк для создания модели. Написал для него удобный UI,  используя Streamlit. Язык разработки - Python. Ч

Возможности:
- Настройка типа и размера модели. То есть не нужно копаться в коде - все вынесено на страницу управления - размер, контеуст, слои, эпохи...

- Возможность как тренировки модели с нуля, так и дообучения на любом этапе.

- Подготовка датасета: можно парсить данные с отсканированных документов, пока что есть поддержка jpg/jpeg/png,  Можно выбирать бесплатный вариант - Tessaract или более крутой - GPT-4 Vision, но он потребует ваш апи ключ. Если знаете варианты - говорить, добавлю

- Обучение идет в фоне. то есть сам фреймворк  не будет тратить ресурсы
- можно выбирать режимы обучения - на обычном процессоре или на GPU

- Встренный режим работы с млделью - можно сразу попробовать пообщаться с ней. Храняться генерации модели - можно дообучать с любого уровня

Если найдутся желающие попробовать - опубликую репозиторий, берите пользуйтесь. Бесплатно.

Для себя выбрал  сейчас 2  каталога - Общая химия(школьная программа)  и  Python. C первой приходится долго возиться-  нужно аккуратно разгребать сканы, править формулы, с пайтоном проще. Но обучать модел можно чему угодно - это обычный трансформер.

И сразу первые результаты и понимание - нужно много данных. 
Интересно?

Вопрос - кто нибудь пробовал  работать с  GPT-4 Vision. для распознавания отсканированных документов? Все таки Тессаракт требует постобработки. Вопрос к тем, кто пользовался исключительно!
Александр Воробьев #:
Так к 52 пристегивалась память. Если фотку глянешь в гугле там сверху (видны края крышек слотов)
Да, я все напутал, у меня был МК-61, а 52-й был с памятью
Александр Воробьев #:
У Слая реализовано, лично у меня нет знаний для оценки уровня. Да и подходы могут быть разные, на мой взгляд (как я понял) тебе важны шашечки (это я про то что когда увидел вспенил начало двухтысячных), а я смотрел там на "ехать" - мне вообще пофиг как внешне форум выглядит.
Ой ну не прибедняйся - ты вполне в состоянии оценить с твоими компетенциями. Провда  особо и нечего оценивать - публично я пока не могу дать в руки всем этот функционал, а без настройки своего ИИ-аватара - сложно понять идеи. В целом форум был задуман исключительно как аватар для отработки RAG  систем. Если вдруг из этого что-то вырастет - вряд ли он останется на сервисе в таком виде. 

Александр Воробьев #:
1987 на станции юных техников открылся кружок программирования.
У нас с тобой похожий путь в айти) Наконеч-то первый отзыв от тру-порграммера.
Зато у меня сразу был МК-54 - он мощнее) Но мечтал об МК-64 - он с памятью был. 
ArbNet #:
ы хоть для приличия названия функций немного поменял, сразу же видно подчерк ИИ.
Прочитай для начала что такео

Naming Conventions /PEP8
Чтоб не было такого ужаса как в твоем фреймворке. 

ArbNet #:
И ты это называешь нейросетью

Да, это именно нейросеть. Примитивная. Но рабочая, с обьяснением всех этапов ее тренировки и референса. Я знаю в приведенном примере и математику и  код, ты - вряд ли.
Не понимаю, что ты подразумеваешь под "реальными  нейросетями". Естественно, это учебный пример, никто не будет(кроме тебя конечно) страдать и делать все это руками.

Тебя вообще никто никуда не втягивал, ты сам завел песню про нейросети в оправдание что не делаешь фреймворк. Стоило копнуть глубже - оказалось, что  ты не понимаешь разницы между  тулом и нейросетью. Не можешь обьяснить что ты хочешь улучшить, знаешь почему - потому что все это выдумки в твоей голове. Это даже не верхи, просто ветер у тебя. Я вот не поленился поискал информацию, чтобы что-то аргументированно утверждать.

Поэтому твои заявки о том что ты знаешь что можно что-то там улучшить - пустозвонство. Для этого нужно  как минимум понимать существующую архитектуру. Как ты можешь что-то оптимизировать под слабые компьютеры, когда это все - обычные матричный вычисления с квадратичной сложностью. Чем больше данных - тем больше нужно ресурсов. У меня вчера тренировка модели на 37 Мегабайт заняла больше часа и использованием MPS   на маке и я впераые услыхал, как у него вентилятор работает. Обуча, кстати на сообщениях из форума и получил интересные результаты.

Поэтому для текста сегодня - только трансформер как самая прогрессивная модель. Можешь прочитать про Mamba,  в чем ее преимущества  и почему она все еще буксует. Потом напускай на себя загадочный вид. Все о чем ты говоришь - давно уже сделано.

Но! Эта дискуссия натолкнула меня на интересные вещи. Начав вспоминать  базу, я вернулся к фреймворкам для написания нейросетей, если точнее  - Pytorch. Да, я знаю что у того же Антропик сейчас JAX в фаворе. Но первый я уже знаю, не стал тратить время на  изучение пока.

Что сделал - написал  простой интефейс, который позволяет  подготовить датасет к модели и натренировать ее. Получил интересный разультат. Локальная модель, в которую загружены сообщения от нехаоса, в тиоге начинает "понимать основы" и начинает выдавать информацию об исскуственном интеллекте, например. Это прсото удивительно. Этого нет в сообщениях нехаоса, при это. нейросеть уже строит правильные ответы! На датасете в 147Кбайт и самой модели в 37Мег! Очередной привет тем, кто заявляет что ЛЛм - обычный поиск)))

Можно проверить по его сообщениям - там такого и в помине нет!

По итогу я понял, что могу реально отказаться вообще от оллама и чужих моделей. Подготовив датасет, я получу например решателя задач по химии. Я еще и распознавалку написал для того чтобы перекачать быстро задачки из бумажных учебников.

И это все под твои сказочки 🤣
 

Кстати, хочу тебе сказать спасибо, Streamit оказался  классной штукой для локали - чтобы не возится с разворачивнием UI  через большие фреймворки. Я как то раньше не сталкивался
Мой путь.

Начало 80-х кажется, был в гостях в Москве и увидел просто обычный калькулятор у родственников. Не то чтоб  я их не видел, но вот дома, с возможностью поиграться прям с цифрами, которые сам складываются - наверное это меня тогда и приворожило навсегда.
Потом был уже свой  программируемый калькулятор МК-54 и журнал Наука и Техника, где в каждом выпуске рассказывалось о какой-то программе для него. Написание своей первой игрушки, ха, по факут это был прототип Angry Birds,  как я сейчас понимаю - стрельба из пушки)
Дальше я попал в первый год обучения когда ввели информатику в школах. На весь город был всего один класс с КУВТ Ямаха, нас туда водили вроде раз в неделю. Для всех это было мука и трата времени, но не для меня - меня оттуда не могли выгнать. На уроках наша информатичка отсаживала меня на заднюю парту и просила молчать, что бы я не позорил ее авторитет.  Хорошая была тетка, только знаний - краткие курсы летом. А у меня был друг еще и его старшая сестра работала в каком то ВЦ, там стояли советские аналоги вроде как IBM 360, Но уже с дисплейными терминалами, не перфокарты. и я туда прерывался при малейшей возможности. 
Так что у меня не стоял выбор института по окончании школы - конечно же МРТИ. И понеслось.

Fortran  на перфокартах,  Паскаль во всех вариациях, для диплома писал программу на ассемблере. Потом армия - все искал как подключится к встроенной ЭВМ  ЗРК  С-200. Слава богу не дали, неизвестно чтобы я там натворил.)))
После армии  - работа в институте, филиале Госкомстата, в отделе программирования. Писали первую автоматизацию для нынешнего БеларусБанка - DBaseII, DBaseIII, FoxPro. 
Потом частная фирма руководитель отдела автоматизации, попытка автоматизировать торги на сырьевой бирже, но это быстро развалилось все как и все в 90-е и надолго ушел в свой бизнес, никак не связанный с компьютерами, правда на полставки числился инженером-программистом в школе. 
После ухода из торговли примерно в 2007 году - своя фирма по прокату авто. И там понадобился уже свой сайт - это был мой приход в веб. Сначала что-то ужасное на народ.ру и хтмл, потом Вордпресс. Понял что мен этим интереснее заниматься чем  прокатом и постепенно свернул деятельность, переключившись на интенет полностью. Вордпресс, Drupal, Jumla, YiII, Laravel,  как полагается свой самописный фреймворк.
Какие-то попытки  в SEO - неинтерсно. 

Ради интереса решил поискать вакансии по Вордпресс и в 2016 году попал в фирму продуктовую, где проработал 2 года начальником отдела  веб-разработки. Пришел  просто написать им сайт на вордпресс, но остался дольше ожидаемого, еще и отпускать не хотели.
В это время хороший друг, с одного форума кстати, которого давно нет, окунул меня в мир Пайтон. С тех пор  и все изменилось. 
Вполть до того, что я успешно прошел интервью на позицию Сеньор ПХП/Вордпресс разработчику в крупнейший белорусский аутсорс, но отказался от оффера.
Правда через полгода  получил оффер в эту же фирму на позицию Пайтон инженер. 2018 год. Ну и вот я все еще там, Поменял правда локацию.

Ухты, надо сохранить это где-то сбе, второй раз я на такой повод не пойду.

ArbNet #:
Я тебе говорил уже, учить меня будешь когда сам что-то сделаешь, свою нейросеть напишешь без готовых библиотек в данном случае, тогда да, можно будет тебя считать математиком. И не по готовым примерам, а что-то своё придумаешь более гибкое и лучшее решение. Вот тогда я буду к тебе прислушиваться, а сейчас завали свой учительский талант от сюда подальше.
Вот жаль что ты не умеешь слушать, а из-за отсутствия знаний переходишь снова на личности, ну да ладно, не стану обращать на это внимания, давай по делу. Решил немного глубже уйти в тему. 
ArbNet #
так как в нейросетях абсолютно другие подходы,

Какие, раз уж ты об этом заговорил? Ладно, ты все равно не ответишь, поэтому сам. Цепь Маркова это самый примтивный предикт, распределение весов в зависимости от предыдущего состояния.
Нейросеть математически это просто матрица весов,  вектор входов, вектор смещения послойно. Когда ты заявляешь, что знаешь, как сделать лучше, что ты имеешь ввиду?
Вот я субботу провел продуктивно.
Так как ты кричишь - что я все делаю с помощью библиотек, тряхнул стариной. Начал без Pytorch/JAX, чтоб по олдскульному.
Вот тебе простая нейросеть - корреляция температуры и влажности. 

import math



def matmul(W, x):

  """

  Матричное умножение W @ x.


  W — список списков (матрица весов), размер [n_out x n_in].

  x — список чисел (входной вектор), длина n_in.


  Возвращает список длины n_out: каждый элемент —

  скалярное произведение строки W на вектор x.


  Пример:

      W = [[1, 0], [0, 1]]  # единичная матрица 2x2

      x = [3.0, 5.0]

      matmul(W, x)  # → [3.0, 5.0]

  """

  return [

      sum(W[i][j] * x[j] for j in range(len(x)))

      for i in range(len(W))

  ]



def add(a, b):

  """

  Поэлементное сложение двух векторов: a + b.


  a, b — списки чисел одинаковой длины.


  Возвращает список той же длины.

  Используется чтобы прибавить смещение b после matmul.


  Пример:

      add([1.0, 2.0], [0.5, -0.5])  # → [1.5, 1.5]

  """

  return [a[i] + b[i] for i in range(len(a))]



def relu(z):

  """

  Активация ReLU (Rectified Linear Unit): max(0, z) для каждого элемента.


  z — список чисел (выход линейного слоя до активации).


  Возвращает список той же длины: отрицательные значения заменяются нулём,

  положительные остаются как есть.


  Зачем нужна: без нелинейной активации стек слоёв

  математически равен одному матричному умножению.


  Пример:

      relu([-1.2, 0.0, 3.4])  # → [0, 0, 3.4]

  """

  return [max(0, v) for v in z]



def sigmoid(z):

  """

  Активация sigmoid: 1 / (1 + e^(-z)) для каждого элемента.


  z — список чисел.


  Возвращает список значений в диапазоне (0, 1).

  Удобна на выходном слое для задач бинарной классификации:

  результат можно интерпретировать как вероятность.


  Пример:

      sigmoid([0.0])   # → [0.5]

      sigmoid([5.0])   # → [~0.993]

      sigmoid([-5.0])  # → [~0.007]

  """

  return [1 / (1 + math.exp(-v)) for v in z]



def forward(x, W1, b1, W2, b2):

  """

  Полный forward pass: прогон входа через сеть.


  Архитектура: вход → скрытый слой (ReLU) → выходной слой (sigmoid).


  Аргументы:

      x  — входной вектор, список длины n_in.

      W1 — матрица весов скрытого слоя, размер [n_hidden x n_in].

      b1 — смещения скрытого слоя, список длины n_hidden.

      W2 — матрица весов выходного слоя, размер [n_out x n_hidden].

      b2 — смещения выходного слоя, список длины n_out.


  Возвращает:

      y  — выходной вектор, список длины n_out.

             Каждое значение в диапазоне (0, 1).


  Внутри происходит:

      z1 = W1 @ x + b1   # линейное преобразование

      h  = relu(z1)       # нелинейная активация

      z2 = W2 @ h + b2   # снова линейное

      y  = sigmoid(z2)    # финальная активация

  """

  z1 = add(matmul(W1, x), b1)

  h  = relu(z1)

  z2 = add(matmul(W2, h), b2)

  y  = sigmoid(z2)

  return y



# ---------------------------------------------------------------------------

# Веса и смещения — здесь хранятся "знания" сети.

# В реальной задаче они подбираются обучением (backprop).

# Здесь заданы вручную для демонстрации forward pass.

# ---------------------------------------------------------------------------


W1 = [

  [ 0.5, -0.3],   # веса нейрона h0: смотрит на x[0] и x[1]

  [ 0.8,  0.1],   # веса нейрона h1

  [-0.6,  0.9],   # веса нейрона h2

]

b1 = [0.1, -0.2, 0.3]   # смещения скрытого слоя


W2 = [[0.7, -0.4, 0.6]]  # один выходной нейрон смотрит на h0, h1, h2

b2 = [0.0]


# ---------------------------------------------------------------------------

# Вход: два признака, например [температура, влажность]

# или просто любые два числа.

# ---------------------------------------------------------------------------

x = [1.0, 0.5]


y = forward(x, W1, b1, W2, b2)


print(f"Вход:  {x}")

print(f"Выход: {y[0]:.4f}  (вероятность от 0 до 1)")

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

Но конечно, это все игрульки и трата времени, мы это на первом курсе универа проходили. Ух, как же я боялся нашего математика! Кто кто получал вышку  в 90-х годах в Минске, навернаяка знают учебник ддля вузов, написанный Жевняк и Карпук - вот Карпук у нас все это безобразие и вел.

Как я уже говорил - игрульки это когда есть Numpy. - математика под пайтон, написанная на плюсах.
Кода немного меньше, но эффективность в 10-ки и сотни раз выше

import numpy as np



def relu(z):

  """

  ReLU: max(0, z) поэлементно.


  z — np.array любой формы.

  Возвращает массив той же формы.

  """

  return np.maximum(0, z)



def sigmoid(z):

  """

  Sigmoid: 1 / (1 + e^-z) поэлементно.


  z — np.array любой формы.

  Возвращает массив той же формы, значения в (0, 1).

  """

  return 1 / (1 + np.exp(-z))



def forward(x, W1, b1, W2, b2):

  """

  Forward pass: вход → скрытый слой (ReLU) → выход (sigmoid).


  Аргументы:

      x  — np.array формы (n_in,)

      W1 — np.array формы (n_hidden, n_in)

      b1 — np.array формы (n_hidden,)

      W2 — np.array формы (n_out, n_hidden)

      b2 — np.array формы (n_out,)


  Возвращает:

      y  — np.array формы (n_out,), значения в (0, 1)

  """

  z1 = W1 @ x + b1

  h  = relu(z1)

  z2 = W2 @ h + b2

  y  = sigmoid(z2)

  return y



# ---------------------------------------------------------------------------

# Веса — в реальности подбираются обучением, здесь заданы вручную.

# ---------------------------------------------------------------------------


W1 = np.array([

  [ 0.5, -0.3],

  [ 0.8,  0.1],

  [-0.6,  0.9],

])

b1 = np.array([0.1, -0.2, 0.3])


W2 = np.array([[0.7, -0.4, 0.6]])

b2 = np.array([0.0])


x = np.array([1.0, 0.5])


y = forward(x, W1, b1, W2, b2)


print(f"Вход:  {x}")

print(f"Выход: {y[0]:.4f}")


Ну как тебе? Заметь, это далеко не все, что я сделал за выходные, пока ты прокрастинировал...
Будешь продолжать спорить со мной о знаниях?
Всего: 8562