Меня можно предсказать на 95%

Клавиатура подсвечивает три клавиши, которые я, скорее всего, нажму следующими. Ставки делает маленькая языковая модель, которую я обучил на своей переписке. В 95,5% случаев следующая буква среди трёх горящих.

Ширина и вес каждой буквы заголовка показывают ставку модели на неё. Цифр «95» модель не ждала.

Рендер в браузере. MCHOSE G75 Pro, stone black. Набрано «Привет, как д», горят T, J и E

Чем увереннее ставка, тем шире и жирнее буква

Одна и та же «о» при ставке от 1% до 100%. Ширина и вес растут как p в степени 0,4, по той же кривой, что яркость клавиши.

Полоска под буквой показывает свет

  • буква горела первой ставкой
  • второй ставкой
  • третьей ставкой
  • не горела
  • первая буква сообщения, ставки нет
Рендер, макро. Фокус на T

Кириллицы на клавишах нет

Модель ставит на «е», а загорается T, потому что в раскладке ЙЦУКЕН «е» стоит на T. Если у знака нет своей клавиши, как у переноса строки, свет уходит следующей ставке.

    Цвет показывает место ставки. Яркость показывает её размер

    Рендер. Сверху вниз первая, вторая и третья ставки. Слева направо ставка растёт от 0,5% до 100%

    Первая версия красила клавишу по уверенности, от синего «гадаю» до белого «знаю». Вторая и третья ставки почти всегда близки, и в 79% случаев им доставался один оттенок.

    Теперь у каждого места свой цвет. Яркость растёт как p в степени 0,4, поэтому слабая ставка не гаснет: ставка 6% светит на треть.

    Сначала общие тексты, потом моя переписка

    163 млн 5,3 млн
    символов общих текстов символов моих сообщений, около 3% от всего

    Общие тексты

    Детские рассказы TinyStories, английская и русская Википедия. На них модель учится языку вообще. 14 минут на ноутбуке.

    Моя переписка

    Только мои сообщения из экспорта Телеграма, по строке на сообщение. Числа из двух и больше цифр я заменил на <num>. 26 минут дообучения, 8000 шагов.

    3,4 млн параметров · 4 слоя · окно 256 знаков · словарь 401 знак с заглавными и эмодзи

    Последний 1% переписки, 53 тысячи символов, модель не видела. На нём я и считал всю точность дальше.

    Зелёная клавиша права в 9 случаях из 10

    Простая статистика по трём предыдущим буквам, без нейросети, угадывает первой ставкой 70 нажатий из 100. Модель угадывает 90.

    70
    Статистика по трём буквам без нейросети, в тройке 91,6%
    90
    Модель словарь 401 знак, в тройке 95,5%

    100 нажатий на отложенной переписке, доли округлены до целых. Условием приёмки было обогнать статистику в тройке на 3 пункта, вышло 3,9. Первая версия модели со словарём 136 знаков угадывала первой ставкой 77,7%, в тройке 94,8%.

    На каждую букву 401 ставка. Горят три

    После «Привет, как д» три лидера забирают 91,8%.

    Все знаки словаря по убыванию ставки. Высота столбика равна яркости, которую получила бы клавиша.

    84% на «хорошо». Дальше шла «а»

    Рендер. Горят J, T и B. Нажата F, на ней «а»

    В моей переписке «хорошо» встречается 2218 раз, «хорошая» 78 раз, «хорошая погода» трижды. Модель выучила именно это.

    «А» оказалась четвёртой ставкой с 2,7% и не загорелась. Модель ставит на то, что чаще встречалось в моих сообщениях. Знать, что я напишу дальше, она не может.

    Кадр света занимает 385 байт

    Протокол нашёлся в исходниках официального веб-драйвера, снифер не понадобился. Канал 0x06 перекрашивает клавиши, но во время печати каждая запись добавляет плавающую задержку. Её чувствуют пальцы, а счётчики не видят.

    Канал 0x08 драйвер использует для эквалайзера под музыку. Кадр ложится в отдельный буфер, и опрос клавиш его не ждёт.

    Кадр для «Привет, как д». До 519 байт отчёт добивается нулями.

    Между нажатием и светом около 21 мс

    Нажатие перехватывает keytap на Swift раньше приложения. Node-процесс берёт последние 256 знаков, прогоняет модель и собирает кадр из трёх ставок. Python нужен только для обучения.

    keytap и прошивку я не замерял, на шкале их нет. Bluetooth не подходит: пока клавиатура подключена к маку по Bluetooth, macOS держит её сама и сторонний процесс к ней не пускает. Свет работает по проводу и через донгл 2,4 ГГц.

    Дальше модель будет учиться на нажатиях

    Каждое нажатие уже оценка. Клавиатура подсветила три клавиши, и я нажал одну из них или другую. Из таких событий соберётся дообучение с подкреплением, пачками, а не на каждое нажатие.

    95,5% посчитаны на отложенной переписке. Точность на живой печати с новой моделью я ещё не перемерил.

    Так выглядят события. Шаги из прогона фразы «Мне нужно закончить проект», точка значит пробел.
    контекстгорелинажатаитог

    Отдельно пишутся все нажатия

    Это кейлоггер, и я обращаюсь с ним как с кейлоггером. Демон под launchd пишет лог только на ноутбук, и читать файл могу только я. Числа из двух и больше цифр он заменяет на <num>, сочетания с Cmd и Ctrl не пишет, по ⌃⌥K встаёт на паузу. Часть полей с паролями macOS закрывает от перехвата сама.

    Рендер с низкого ракурса. «!» на клавише 1, «)» на клавише 0

    48,8% на конец сообщения

    После «Спасибо» модель ставит 48,8% на перенос строки, то есть на конец сообщения. Переноса на клавиатуре нет, поэтому горят «!», пробел и скобка.

    Теперь печатаешь ты

    Ниже работает та же модель, что зажигает клавиатуру, только в браузере. Её учили на моей переписке, и ставит она на то, что написал бы я.

    При первом запуске браузер скачает около 24 МБ, модель и движок для неё. Окно здесь 64 знака вместо 256, точность по замеру та же.