Меня можно предсказать на 95%Меня можнопредсказатьна 95%
Клавиатура подсвечивает три клавиши, которые я, скорее всего, нажму следующими. Ставки делает маленькая языковая модель, которую я обучил на своей переписке. В 95,5% случаев следующая буква среди трёх горящих.
Ширина и вес каждой буквы заголовка показывают ставку модели на неё. Цифр «95» модель не ждала.
Чем увереннее ставка, тем шире и жирнее буква
Одна и та же «о» при ставке от 1% до 100%. Ширина и вес растут как p в степени 0,4, по той же кривой, что яркость клавиши.
Полоска под буквой показывает свет
- буква горела первой ставкой
- второй ставкой
- третьей ставкой
- не горела
- первая буква сообщения, ставки нет
Кириллицы на клавишах нет
Модель ставит на «е», а загорается T, потому что в раскладке ЙЦУКЕН «е» стоит на T. Если у знака нет своей клавиши, как у переноса строки, свет уходит следующей ставке.
Цвет показывает место ставки. Яркость показывает её размер
Вторая и третья ставки после «Привет, как д».
Первая версия красила клавишу по уверенности, от синего «гадаю» до белого «знаю». Вторая и третья ставки почти всегда близки, и в 79% случаев им доставался один оттенок.
Теперь у каждого места свой цвет. Яркость растёт как p в степени 0,4, поэтому слабая ставка не гаснет: ставка 6% светит на треть.
Сначала общие тексты, потом моя переписка
Общие тексты
Детские рассказы TinyStories, английская и русская Википедия. На них модель учится языку вообще. 14 минут на ноутбуке.
Моя переписка
Только мои сообщения из экспорта Телеграма, по строке на сообщение. Числа из двух и больше цифр я заменил на <num>. 26 минут дообучения, 8000 шагов.
3,4 млн параметров · 4 слоя · окно 256 знаков · словарь 401 знак с заглавными и эмодзи
Последний 1% переписки, 53 тысячи символов, модель не видела. На нём я и считал всю точность дальше.
Зелёная клавиша права в 9 случаях из 10
Простая статистика по трём предыдущим буквам, без нейросети, угадывает первой ставкой 70 нажатий из 100. Модель угадывает 90.
100 нажатий на отложенной переписке, доли округлены до целых. Условием приёмки было обогнать статистику в тройке на 3 пункта, вышло 3,9. Первая версия модели со словарём 136 знаков угадывала первой ставкой 77,7%, в тройке 94,8%.
На каждую букву 401 ставка. Горят три
После «Привет, как д» три лидера забирают 91,8%.
Все знаки словаря по убыванию ставки. Высота столбика равна яркости, которую получила бы клавиша.
84% на «хорошо». Дальше шла «а»
В моей переписке «хорошо» встречается 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 закрывает от перехвата сама.
48,8% на конец сообщения
После «Спасибо» модель ставит 48,8% на перенос строки, то есть на конец сообщения. Переноса на клавиатуре нет, поэтому горят «!», пробел и скобка.
Теперь печатаешь ты
Ниже работает та же модель, что зажигает клавиатуру, только в браузере. Её учили на моей переписке, и ставит она на то, что написал бы я.
При первом запуске браузер скачает около 24 МБ, модель и движок для неё. Окно здесь 64 знака вместо 256, точность по замеру та же.