Русский
Русский
English
Статистика
Реклама

Блог компании sberdevices

Навыки для виртуальных ассистентов на веб-технологиях

28.12.2020 14:06:07 | Автор: admin

Недавно Cбер запустил Салют семейство виртуальных ассистентов, которые работают на разных платформах. Мы в SberDevices, кроме самого ассистента, занимаемся разработкой инструментов, позволяющих любому разработчику удобно создавать навыки, которые называются смартапы. Кроме общеизвестных диалоговых сценариев в формате чата ChatApp, можно создавать смартапы в формате веб-приложения на любых известных веб-технологиях Canvas App. О том, как создать простейший смартап такого типа, и пойдет сегодня речь.

Canvas App стандартное веб-приложение в привычном понимании, которое запускается и работает внутри WebView, но есть свои особенности.

Как это работает по шагам:

  1. Пользователь произносит ключевую фразу, например Салют, какие у меня задачи на сегодня.

  2. Голосовой запрос приходит в NLP-платформу, где разбирается на фонемы, там же определяется его эмоциональный окрас и т.д..

  3. В БД зарегистрированных смартапов находится тот, которому соответствует активационная фраза. Регистрация происходит через SmartApp Studio и доступна всем разработчикам без исключения.

  4. Во время регистрации смартапа в SmartApp Studio разработчик указывает два эндпоинта: один для веб-приложения, второй для сценарного бэкенда. Именно их достанет из БД NLP-платформа, когда найдет соответствующий смартап.

  5. В эндпоинт сценарного бэкенда будет отправлено сообщение с распознанной активационной фразой. Формат сообщений подробно описан в документации SmartApp API.

  6. Эндпоинт веб-приложения будет указан для загрузки в WebView.

  7. Ответ от сценарного бэкенда придёт в веб-приложение в качестве JS-события, подписавшись на которое, можно управлять веб-приложением.

Упрощенная схема для наглядностиУпрощенная схема для наглядности

Предмет нашего разговора веб-приложение. Делать будем смартап для ведения тудушек. Поскольку SmartApp Studio предоставляет онлайн-среду разработки сценариев, не будем подробно на этом останавливаться, а воспользуемся форком готового сценария, который в качестве примера доступен на GitHub. В одной из следующих статей расскажем, как написать такой сценарий на NodeJS.

В SmartApp Graph/IDE, той самой онлайн-среде, в качестве источника можно указать git-репозиторий, чем мы и воспользуемся, чтобы получить эндпоинт до сценарного бэкенда. Далее его надо указать при регистрации нашего смартапа в SmartApp Studio. В качестве эндпоинта веб-приложения укажем любой известный веб-ресурс, например, sberdevices.ru. Позже поменяем на URL нашего веб-приложения.

Шаблон проекта

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

Итак, что мы хотим от приложения:

  • добавлять задачи;

  • выполнять задачи;

  • удалять задачи;

  • и все это голосом, но не сразу.

Для создания базового проекта воспользуемся CRA.

> npx create-react-app todo-canvas-app

Для реализации UI нам понадобится как минимум пара компонентов и форма.

Код формы
export const App: FC = memo(() => {  const [note, setNote] = useState("");  return (    <main className="container">      <form        onSubmit={(event) => {          event.preventDefault();          setNote("");        }}      >        <input          className="add-note"          type="text"          value={note}          onChange={({ target: { value } }) => setNote(value)}        />      </form>      <ul className="notes">        {appState.notes.map((note, index) => (          <li className="note" key={note.id}>            <span>              <span style={{ fontWeight: "bold" }}>{index + 1}. </span>              <span                style={{                  textDecorationLine: note.completed ? "line-through" : "none",                }}              >                {note.title}              </span>            </span>            <input              className="done-note"              type="checkbox"              checked={note.completed}            />          </li>        ))}      </ul>    </main>  );});

Дальше нам надо сделать базовую логику нашего приложения. Пользоваться будем стандартными средствами React, используя useReducer.

Код редьюсера
const reducer = (state, action) => {  switch (action.type) {    case "add_note":      return {        ...state,        notes: [          ...state.notes,          {            id: Math.random().toString(36).substring(7),            title: action.note,            completed: false,          },        ],      };    case "done_note":      return {        ...state,        notes: state.notes.map((note) =>          note.id === action.id ? { ...note, completed: !note.completed } : note        ),      };    case "delete_note":      return {        ...state,        notes: state.notes.filter(({ id }) => id !== action.id),      };    default:      throw new Error();  }};

Далее будем диспатчить экшены их обработчиков на форме.

Код подключения
export const App: FC = memo(() => {  const [appState, dispatch] = useReducer(reducer, { notes: [] });  //...  return (    <main className="container">      <form        onSubmit={(event) => {          event.preventDefault();          dispatch({ type: "add_note", note });          setNote("");        }}      >        <input          className="add-note"          type="text"          placeholder="Add Note"          value={note}          onChange={({ target: { value } }) => setNote(value)}          required          autoFocus        />      </form>      <ul className="notes">        {appState.notes.map((note, index) => (          <li className="note" key={note.id}>            <span>              <span style={{ fontWeight: "bold" }}>{index + 1}. </span>              <span                style={{                  textDecorationLine: note.completed ? "line-through" : "none",                }}              >                {note.title}              </span>            </span>            <input              className="done-note"              type="checkbox"              checked={note.completed}              onChange={() => dispatch({ type: "done_note", id: note.id })}            />          </li>        ))}      </ul>    </main>  );});

Запускаем и проверяем.

npm start

Работа с голосом

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

npm i @sberdevices/assistant-client

В момент открытия WebView платформа инжектит JS API для взаимодействия с ассистентом. Это биндиги до нативных методов платформы. Assistant Client обёртка, которая в дев-режиме позволяет отлаживать взаимодействие с ассистентом в браузере, а в продакшене предоставляет удобный для веб-приложений API.

Идём в app.js и там же, где наш основной редюсер, создаем инстанс Assistant Client.

const initializeAssistant = () => {  if (process.env.NODE_ENV === "development") {    return createSmartappDebugger({      token: process.env.REACT_APP_TOKEN ?? "",      initPhrase: `Запусти ${process.env.REACT_APP_SMARTAPP}`,    });  }  return createAssistant();};

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

После этого перезапустим наше приложение. Теперь мы видим панельку ассистента с лавашаром и текстовым полем. Лавашар это такое визуальное представление ассистента. По нажатию на лавашар включится микрофон и вы сможете отправить команду ассистенту так же, как вы бы это сделали, запуская смартап на устройстве. Относитесь к этому не как к эмулятору, а как к дев-тулзам, в продакшене всё это за нас будет делать платформа. Те же самые команды вы можете посылать не только голосом, но и текстом, используя текстовое поле рядом с лавашаром, чтобы не будить своих домашних по ночам.

Ассистент присылает структурированные команды в формате JSON. Полное описание формата можно найти в документации Assistant Client на GitHub.

interface AssistantSmartAppCommand {  // Тип команды  type: "smart_app_data";  // Любые данные, которые нужны смартапу  smart_app_data: Record<string, any>;  sdkMeta: {    requestId: string;  };}

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

export const App: FC = memo(() => {  const [appState, dispatch] = useReducer(reducer, { notes: [] });  const [note, setNote] = useState("");  const assistantRef = useRef();  useEffect(() => {    assistantRef.current = initializeAssistant();    assistantRef.current.on("data", ({ action }) => {      if (action) {        dispatch(action);      }    });  }, []);    // ...

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

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

Для того, чтобы это было удобно делать из веб-приложения, в Assistant Client есть API для передачи состояния getState. В нашем случае стейт это список тудушек и некоторая мета-информация.

Дополним код инициализации Asisstant Client.

const initializeAssistant = (getState) => {  if (process.env.NODE_ENV === "development") {    return createSmartappDebugger({      token: process.env.REACT_APP_TOKEN ?? "",      initPhrase: `Запусти ${process.env.REACT_APP_SMARTAPP}`,      getState,    });  }  return createAssistant({ getState });};

И передадим стейт в обработку ассистенту. Формат стейта также описан в документации Asisstant Client.

export const App: FC = memo(() => {  // ...  const assistantStateRef = useRef<AssistantAppState>();// ...  useEffect(() => {    assistantRef.current = initializeAssistant(() => assistantStateRef.current);    // ...  }, []);  useEffect(() => {    assistantStateRef.current = {      item_selector: {        items: appState.notes.map(({ id, title }, index) => ({          number: index + 1,          id,          title,        })),      },    };  }, [appState]);  // ...

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

Тудух может скопиться достаточное количество, чтобы они не влезли в экран. Само собой, мы хотим уметь скроллить экран, чтобы иметь возможность прочитать всё, что скопилось. На устройствах, где нет тач-интерфейса, например, на SberBox, мы можем скроллить пультом ДУ или голосом. Нажатия кнопок на пульте превращаются в события нажатий на стрелки клавиатуры на window, но что делать с голосом?

Голосовые паттерны навигации встроены в NLP-платформу, и разработчику сценария ничего не надо делать самому. А для разработчика веб-приложения достаточно подписаться на специальный тип команд, приходящих от ассистента через Assistant Client. Все вариации навигационных фраз будут кастится в конечное число навигационных команд. Их всего пять: UP, DOWN, LEFT, RIGHT, BACK.

assistant.on('data', (command) => {    if (command.navigation) {        switch(command.navigation.command) {            case 'UP':                window.scrollTo(0, 0);                break;            case 'DOWN':                window.scrollTo(0, 1000);                break;        }    }});

Перезапускаем наше приложение и пробуем после нажатия на лавашар сказать: Напомни купить коту корм. И вуаля!

Если у вас есть устройство под рукой, то можно проверить работу смартапа на нём. Для этого не обязательно его публиковать или деплоить куда-либо. Достаточно создать тоннель с локального хоста, например, с помощью ngrok.

ngrok http 3000

Полученный URL с https указываем в SmartApp Studio, сохраняем черновик и говорим ассистенту: Сбер, какие у меня задачи на сегодня?. Это cработает, если вы залогинены под одним и тем же SberID на устройстве и в SmartApp Studio. Черновики по-умолчанию доступны к запуску на устройствах разработчика.

Вместо эпилога

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

Этот короткое интро скорее, обзор возможностей на искусственном примере. Как сделать смартап с компонентами, оплатой, автотестами, обязательно расскажем в следующих статьях. Спасибо за внимание, ещё увидимся!

По всем вопросам разработки смартапов можно обращаться в сообщество разработчиков SmartMarket в телеграмме.

Подробнее..

Можно ли воссоздать полную нейросеть мыши из тонких послойных разрезов мозга?

17.09.2020 10:15:44 | Автор: admin
image
Карликовая многозубка, самое маленькое млекопитающее по массе. Внутри маленький целостный сложный мозг, который уже принципиально можно картировать

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

Чтобы приблизиться к оцифровке сознания и такому экзотическому виду бессмертия, стоит сначала разобраться с живыми нейронными сетями. Их реверс-инжиниринг показывает нам, как вообще может быть устроен процесс мышления (вычислений) в хорошо оптимизированных системах.

60 лет назад, 13 сентября 1960 года, учёные собрали первый симпозиум из биологов и инженеров, чтобы они могли разобраться, в чём же разница между сложной машиной и организмом. И есть ли она вообще. Науку назвали бионикой, а целью обозначили применение методов биологических систем к прикладной инженерии и новым технологиям. Биосистемы рассматривались как высокоэффективные прототипы новой техники.

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

Этот пост написан на основе материалов будущей книги нашего коллеги Сергея Маркова Охота на электроовец: большая книга искусственного интеллекта.

Вообще вопрос соотношения физиологических процессов, происходящих в нервной системе человека, и психических явлений один из самых интригующих вопросов современной науки. Представьте себе, что в ваши руки попал секретный компьютерный процессор и вы хотите его скопировать. Вы можете нарезать его тонкими слоями и скрупулёзно скопировать его слой за слоем. Но насколько точная копия вам нужна, чтобы она была полностью или хотя бы частично функциональной? Без экспериментов дать ответ на такой вопрос крайне сложно.

Бионика, или биомиметика, копировала принципы биосистем или брала их за основу. Как Леонардо да Винчи смотрел за полётом птиц и изобретал орнитоптер (к сожалению, подходящих материалов и источников энергии тогда не нашлось), так и мы в двадцатом веке копировали всё более сложные системы. RFID-чипы, медицинские адгезивы (клеи), гидрофобные структуры, наносенсоры всё это и многое другое создавалось по биопрототипам. Где-то само наличие прототипа в природе позволяло понять, что технология в принципе возможна. Если растения способны синтезировать сахара и крахмал из углекислого газа и воды, значит можно создать устройство, выполняющее ту же функцию.

И если эволюция оптимизирует системы в сторону приспособленности к среде, то мы могли оптимизировать их под наши задачи. С точки зрения эволюции человеческий мозг должен потреблять мало энергии, должен быть устойчивым к физическим воздействиям (вряд ли вам понравится, если от падения яблока на голову вы будете полностью терять память), голова младенца должна беспрепятственно преодолевать родовые пути при рождении и так далее.

В случае разработки устройства, использующего те же принципы, у нас нет этих ограничений. Как и сотен других.

Кстати, наши предки часто придерживались терминальной теории мышления, предполагая, что процессы проходят где-то удалённо (в душе) и транслируются в виде команд через какой-то орган. Аристотель с коллегами считал, что терминал души находится в сердце. Но опыты древних врачей были ограничены техническим уровнем цивилизации. Так продолжалось примерно до того, как Луиджи Гальвани в 1791 году обнаружил, что ток заставляет мышцы сокращаться. Эти опыты дали начало исследованиям в области биоэлектрических явлений. В какой-то момент Катон решил замерить потенциалы всего вокруг и начал открывать для своих измерений животных. Он обнаружил, что внешняя поверхность серого вещества была заряжена более положительно, чем глубокие структуры мозга. Он также отметил, что электрические токи головного мозга, по-видимому, имеют отношение к основной функции. Когда я показал обезьяне изюм, но не дал его, произошло небольшое уменьшение силы тока. Благодаря ему же родилась неинвазивная (то есть не связанная с проникновением через внешние барьеры организма) электроэнцефалография. В 1890 году физиолог Адольф Бек из Польши обнаружил низковольтные высокочастотные колебания электрических потенциалов, возникающие между двумя электродами, помещёнными в затылочную кору мозга кролика.

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

За два года до экспериментов Катона, в 1873 году, был открыт метод Гольджи (названный так в честь его автора итальянского физиолога Камилло Гольджи), позволяющий окрашивать отдельные нейроны (правда, слово нейрон не использовалось до 1891 года).

До открытия Гольджи в биологии была популярна концепция, предложенная немецким гистологом Йозефом фон Герлахом, который считал, что волокна, выходящие из различных клеточных тел, соединены в единую сеть, получившую название ретикулум. Популярность идей Герлаха была связана с тем, что, в отличие от сердца или печени, мозг и нервную систему не получалось разделить на отдельные структурные единицы: хотя нервные клетки были описаны в составе ткани многими исследователями того времени, связь между нервными клетками и связывающими их аксонами и дендритами была неясной. Главной причиной этого были недостатки микроскопии. Благодаря своему открытию, Гольджи увидел, что разветвлённые отростки одного клеточного тела не сливаются с другими. Он, однако, не стал отбрасывать концепцию Герлаха, предположив, что длинные тонкие отростки, вероятно, соединены в одну непрерывную сеть.

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

Четырнадцать лет спустя, в 1887 году, испанский нейроанатом Сантьяго Рамон-и-Кахаль доказал, что длинные тонкие отростки, выходящие из тел клеток, вовсе не связаны в единую сеть. Нервная система, как и все другие живые ткани, состояла из отдельных элементов. В 1906 году Рамон-и-Кахаль и Камилло Гольджи за труды по строению нервной системы получили Нобелевскую премию в области физиологии и медицины. Зарисовки Рамон-и-Кахаля, из которых до наших дней дошло около 3 000, и сегодня остаются одними из самых подробных описаний структурного разнообразия мозга и нервной системы.

image
Автор зарисовки Сантьяго Рамон-и-Кахаль (Santiago Ramon y Cajal)

Дальнейшие исследования всё детальнее показывали, что мы можем принципиально разобраться в том, как мы мыслим на инженерном уровне. А, значит, можем и заняться прикладной биомиметикой.

image

Хотя ещё со времён Гальвани было известно, что нервы могут быть возбуждены электрически, однако стимулы, используемые для возбуждения нервов, было довольно трудно контролировать. Какой силы и продолжительности должен быть сигнал? И как связь между стимулом и возбудимостью может быть объяснена за счёт подлежащей биофизики? Этими вопросами задались на границе XIX и XX веков пионеры в области изучения нервной возбудимости Ян Хорвег (Jan Leendert Hoorweg, 18411919, иногда неточно передаётся как Гоорвег), Жорж Вейс (Jules Adolphe Georges Weiss, 18511931) и Луи Лапик (Louis Lapicque, 18661952). В своём первом исследовании 1907 года Лапик представляет модель нерва, которую он сравнивает с данными, полученными при стимуляции нерва лягушки. Эта модель, основанная на простой конденсаторной схеме, послужит основой для будущих моделей клеточной мембраны нейрона.

Просто, чтобы вы понимали сложности науки в те годы, стоит привести пару примеров. Стимулом, который использовал Лапик, был короткий электрический импульс, который подавался через два электрода, разработанных и изготовленных специально для этой цели. В идеале в экспериментах по стимуляции можно было бы использовать импульсы тока, но подходящие источники тока создать было непросто. Вместо этого Лапик использовал источник напряжения батарею. Регулировка напряжения осуществлялась при помощи делителя напряжения, представлявшего собой длинный провод с ползунком, похожий на современный потенциометр. Получить точные импульсы длительностью всего несколько миллисекунд тоже было непросто, изобретённый несколько ранее инструмент для этого был назван реотомом. Устройство состояло из пистолета с капсюльным замком, пуля которого сначала разрывала первую перемычку, создавая ток в стимулирующей цепи, затем разрывала на своём пути вторую перемычку, прерывая контакт.

Работа 1907 года привела Лапика к ряду теоретических рассуждений. Он постулировал, что активация цепочки нервных клеток зависит от последовательной электрической стимуляции каждой клетки импульсом или потенциалом действия предыдущей. Лапик предложил теорию нервных процессов, которая напоминала подстройку или резонанс между колебательными радиоконтурами.

В 1943 году увидела свет книга Лапика La machine nerveuse [Нервная машина], подводящая итог многолетних исследований учёного.

image
Издательство Paris: Maison parisienne Neurdein (ND. Phot.), s.d.

Нередко в рассуждениях о результатах работы Лапика для вычислительной нейробиологии можно столкнуться с утверждением о том, что Лапик является создателем и исследователем первой модели нейрона, носящей название интегрировать-и-сработать [integrate-and-fire]. В соответствии с этой моделью, алгоритм работы нейрона можно описать следующим образом: когда на вход нейрона подаётся ток, разность потенциалов (напряжение) на мембране возрастает со временем, пока не достигает некоторого порогового значения, при котором происходит скачкообразное изменение потенциала на выходе, напряжение сбрасывается до остаточного потенциала, после чего процесс может повторяться снова и снова. В действительности связь между возбуждением нерва и образованием нервного импульса во времена Лапика была ещё неясной, и учёный не выдвигает гипотез ни об этом, ни о том, как мембрана возвращается в исходное состояние после выдачи импульса.

Дальнейшее развитие идей Лапика в рамках вычислительной нейробиологии привело к появлению множества более точных и полных моделей биологического нейрона. В их числе модели интегрировать-и-сработать с утечками [leaky integrate-and-fire], интегрировать-и-сработать с утечками дробного порядка [fractional-order leaky integrate-and-fire], модель Гальвеса Лёкербаха [GalvesLocherbach model], экспоненциальный вариант модели интегрировать-и-сработать [exponential integrate-and-fire] и многие другие. Нобелевская премия 1963 года была выдана за исследования сэра Алана Ллойда Ходжкина (Sir Alan Lloyd Hodgkin, 19141998) и сэра Эндрю Филдинга Хаксли (Sir Andrew Fielding Huxley, 19172012, не путайте с писателем).

image
Источник

Долгопёрый прибрежный кальмар (Doryteuthis pealeii), как и другие кальмары, является чрезвычайно удобным для нейрофизиологов модельным организмом благодаря наличию у него гигантских аксонов. Гигантский аксон кальмаров это очень большой (обычно около 0,5 мм в диаметре, но иногда достигает 1,5 мм) аксон, который контролирует часть водореактивной системы кальмара, используемой им в основном для коротких, но очень быстрых перемещений в воде. Между щупальцами кальмара расположен сифон, через который вода может быстро выталкиваться за счёт сокращений мышц стенки тела животного. Это сокращение инициируется потенциалами действия в гигантском аксоне. Поскольку электрическое сопротивление обратно пропорционально площади поперечного сечения объекта, потенциалы действия распространяются быстрее в большем аксоне, чем в меньшем. Поэтому увеличение диаметра гигантского аксона поддерживалось в процессе эволюции, так как позволяло увеличить скорость мышечной реакции. Это стало настоящим подарком для Ходжкина и Хаксли, которых интересовал ионный механизм потенциалов действия ведь благодаря большому диаметру аксона, в его просвет можно было невозбранно установить зажимные электроды!

image
Источник

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

Один из наиболее интересных проектов осуществляется учёными из лаборатории Себастьяна Сеунга. Ближайшей целью проекта стало создание карты связей нейронов сетчатки мышонка по имени Гарольд. Сетчатка была выбрана в качестве модельного объекта для обкатки технологий, необходимых для достижения долгосрочной научной цели, полного описания коннектома мозга человека. Мышиный мозг был извлечён из черепной коробки и нарезан на тонкие слои.

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

В 2014 году, через два года после запуска EyeWire, сотрудники лаборатории сделали первое открытие и рассказали о нём в журнале Nature. Учёным удалось выяснить, как именно млекопитающие распознают движение. Когда свет попадает на клетки фоторецепторов, они передают сигнал биполярным клеткам, затем амакриновым и, наконец, ганглионарным. Учёные проанализировали 80 звёздчатых амакриновых нейронов (29 из них помогли описать игроки EyeWire) и соединённые с ними биполярные клетки. Они заметили, что разные типы биполярных клеток по-разному соединяются с амакриновыми нейронами: биполярные клетки одного типа располагаются далеко от сомы (тела) звёздчатой клетки и передают сигнал быстро, клетки другого типа располагаются близко, но сигнал передают с задержкой.

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

Размеченные игроками данные были использованы для того, чтобы обучить на них соответствующие модели машинного обучения, которые затем смогут выполнять раскраску самостоятельно. Своеобразная ирония заключается в том, что в основе этих моделей лежат свёрточные нейронные сети (о них мы поговорим подробно несколько позже), созданные, в свою очередь, под влиянием научных данных, полученных в ходе изучения зрительной коры головного мозга.

2 апреля 2013 года началась программа BRAIN Initiative. Первым кирпичиком в фундаменте стала статья Пола Аливизатоса, в которой были изложены экспериментальные планы для более скромного проекта, в том числе рассмотрены методы, которые могут быть использованы для построения функционального коннектома, а также перечислены технологии, которые необходимо будет разработать в ходе проекта. От червей и мух планировалось перейти к более крупным биосистемам, в частности, карликовой многозубке. Это самое маленькое по массе тела из известных науке млекопитающих, а её мозг состоит из всего примерно миллиона нейронов. От землероек можно будет перейти к приматам, в том числе на последнем этапе к людям.

Первый коннектом живого существа, а именно нематоды C. elegans, был построен в далёком 1986 году группой исследователей во главе с биологом Сидни Бреннером (Sydney Brenner, 19272019) из Кембриджа. Бреннер и его коллеги аккуратно нарезали миллиметровых червей на тонкие ломтики и сфотографировали каждый срез с помощью плёночной камеры, установленной на электронном микроскопе, а затем по полученным снимкам вручную проследили все связи между нейронами. Однако у C. elegans всего 302 нейрона и около 7 600 синапсов. В 2016 году команда учёных из Университета Дэлхаузи в Канаде повторили подвиг своих коллег для личинки морского оболочника Ciona intestinalis, центральная нервная система которого, как выяснилось, состояла из 177 нейронов и 6 618 синаптических соединений. Однако надо заметить, что методы, используемые для построения коннектома, неэффективны для крупных нервных систем. Исследователи не задумывались всерьёз о том, чтобы приступить к осуществлению значительно более крупных проектов до 2004 года, когда физик Винфрид Денк и нейроанатом Хайнц Хорстманн предложили использовать автоматический микроскоп для разрезания и визуализации мозга, а также программное обеспечение для сбора и соединения результирующих изображений.

В 2019 году в журнале Nature появилась публикация доктора Скотта Эммонса с подробным отчётом о воссоздании коннектома нематоды Caenorhabditis elegans при помощи нового метода. Годом раньше группа учёных под руководством Чжихао Чжэна (Zhihao Zheng) из Принстонского университета завершила работу над сканированием мозга дрозофилы, состоящего из примерно 100 тысяч нейронов. Система, разработанная Чжэном и его коллегами, позволила пропустить через просвечивающий растровый электронный микроскоп более 7 000 тончайших срезов мозга мушки, толщина каждого из которых составляла порядка 40 нм, а суммарный размер полученных в результате изображений составил 40 триллионов пикселей.

В апреле 2019 года сотрудники Института головного мозга им. Аллена в Сиэтле отпраздновали преодоление последнего рубежа в проекте по картированию одного кубического миллиметра мозга мыши с его 100 000 нейронов и одним миллиардом связей между ними. Чтобы обработать образец размером с горчичное зёрнышко, микроскопы работали непрерывно в течение пяти месяцев, собрав более 100 миллионов изображений 25 000 срезов зрительной коры. Затем программному обеспечению, разработанному учёными института, потребовалось около трёх месяцев, чтобы объединить изображения в единый трёхмерный массив объёмом 2 петабайта. Все собранные более чем за 30 лет миссиями Landsat снимки нашей планеты занимают всего около 1,3 петабайта, что делает сканы мозга мыши практически целым миром в песчинке. Конечная цель наноразмерный коннектом человеческого мозга пока ещё далеко. Число нейронов в нём сопоставимо с количеством звёзд в Млечном Пути (порядка 1011). При использовании современной технологии обработки изображений потребуются десятки микроскопов, работающих круглосуточно на протяжении тысячи лет, чтобы собрать данные, необходимые для достижения конечной цели. Но достижения в области микроскопии, а также разработка более мощных компьютеров и алгоритмов для анализа изображений, продвинули область коннектомики вперёд столь быстро, что это удивляет и самих исследователей. Пять лет назад было слишком амбициозно думать о кубическом миллиметре, говорит Рэйд. Сегодня многие исследователи считают, что полное картирование мозга мыши, объём которого составляет около 500 кубических миллиметров, станет возможным в следующем десятилетии. Сегодня картирование человеческого мозга на синаптическом уровне может показаться невероятным. Но если прогресс будет идти вперёд теми же темпами, как в вычислительных мощностях, так и в научных методах, ещё одно тысячекратное увеличение возможностей уже не кажется нам немыслимым.

image

BRAIN Initiative не единственная масштабная программа в этой области. Созданием функциональной модели мозга крысы (с прицелом на мозг человека) заняты и учёные из проектов Blue Brain Project и Human Brain Project. Не стоит на месте и China Brain Project.

Собственно, теперь, когда вы понимаете сложность этих биологических прототипов, можно переходить к инженерному подходу и постепенно начать обсуждать применение принципов в современных вычислениях. Но об этом в следующий раз. Или куда как более детально эта часть и следующие в книге Сергея Маркова Охота на электроовец: большая книга искусственного интеллекта, которая готовится к публикации издательством Альпина нон-фикшн. Пока книгу купить ещё нельзя, а вот посты по материалам уже читать можно. Ну и вообще oulenspiegel очень крутой специалист.
Подробнее..

О том, как гениальный беспризорник и профессор пили виски и придумывали первую модель искусственного нейрона

29.10.2020 10:19:47 | Автор: admin

Первая модель искусственного нейрона Мак-Каллока-Питтса

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

Один из дедушек современных нейросетей это перцептрон Розенблатта, представленный публике в конце 1950-х, но его появлению предшествовали другие, менее известные попытки описать принципы, по которым могла бы работать думающая машина, подобная мозгу. К ним относятся исследования Уолтера Питтса и Уоррена Мак-Каллока. Их модель, увидевшая свет в 1943-м году в статье под названием Логическое исчисление идей, относящихся к нервной активности, была весьма новаторским изобретением. И за ней стоит довольно занятная история. Кто такие были эти товарищи, приложившие руку к созданию модели? Чопорные учёные в очках с роговой оправой или, может, аналог современных хипстеров из thinktankов?

Согласно рукописи нашего коллеги Сергея Маркова aka oulenspiegel, по рассказам очевидцев, этих учёных объединяла не только любовь к математике и нейрофизиологии, но и, например, левые взгляды: на вечеринках у Уоррена Мак-Каллока собиралась интеллигенты, пили виски и обсуждали разные актуальные научные и политические вопросы. Но об этом немного позже.

Предыстория


Начнём с того, что если бы не было Уолтера Питтса, может быть, никакой модели и не было бы создано. Как смог Питтс, простой мальчишка из Детройта, выросший в неблагополучной семье, познакомиться с профессором? Часто он сбегал из дома, так как, по словам друга и коллеги Питтса, Джерома Летвина, отец мальчика был водопроводчиком и часто бил сына. В один из таких эпизодов Питтс провёл неделю в библиотеке, где в его руки попала книга Бертрана Рассела и Альфреда Уайтхеда Principia Mathematica (Основания математики; в научных трудах эту фундаментальную работу обычно называют просто PM). Мир математики, такой уютный и безопасный, в отличие от реального, не на шутку увлёк мальчика. Уже тогда, в 13 лет, он смог сформулировать ряд вопросов, письмо с которыми адресовал Расселу. Тот ответил с восхищением и благодарностью и предложил Питтсу приехать учиться в аспирантуре в Кембридже. Увы, для тринадцатилетнего подростка это было абсолютно нереально, но через несколько лет, когда Рассел прибыл в США прочитать курс лекций в Чикагском университете, Питтс отправился в Чикаго, сбежав из отчего дома, чтобы уже не вернуться в него никогда. Рассел с радостью встретил юного Уолтера и представил его своему приятелю Рудольфу Карнапу, математику, который в то время работал в Чикагском университете. Карнап остался впечатлён. Но из-за того, что пятнадцатилетний вундеркинд закончил лишь неполное школьное образование, он не смог официально стать студентом университета. В итоге юноше выделили специальную небольшую стипендию, которой хватало на то, чтобы снимать небольшую комнатёнку и перебиваться с хлеба на воду. Работая с Карнапом, Питтс заинтересовался работами по математической теории нервной проводимости, написанными Николаем Рашевским, украинским иммигрантом в США, отцом-основателем математической биофизики.

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

Так как Питтс заинтересовался темой математического моделирования мозга, Джером Летвин, со слов которого мы много знаем о юности Питтса, решил познакомить того с Уорреном Мак-Каллоком, который занимался исследованиями мозга и на тот момент недавно перебрался в Чикаго. Последний быстро привлек юношу к своему проекту по созданию логической модели мозга и нервной системы.

Питтс на несколько лет перебрался в дом Мак-Каллоков, где эти двое начали работу над взломом логики нейронных сетей мозга. Неделями они анализировали потоки сигналов по разветвлённым мозговым путям, вспоминал позже Летвин. При этом 18-летний Питтс, похожий на уточку-очкарика, разительно контрастировал со своим коллегой, философом и мечтателем 42-х лет, который частенько сопровождал свои штудии бокалом хорошего виски. Посиделки товарищей вылились в одну из основополагающих работ в области искусственного интеллекта, название которой мы уже упоминали Логическое исчисление идей, относящихся к нервной активности.

Уолтер Питтс

Мак-Каллок был сыном бизнесмена. Он получил религиозное школьное образование, но вскоре отошёл от религии и стал размышлять в научных терминах о том, как устроен человек. Если разумом движет не бог, то значит какие-то механизмы, рассуждал он. В поиске этих механизмов он и пришёл к своей исследовательской теме как работает мозг и сознание. Он получил хорошее университетское образование и с 1934-го года работал в Лаборатории нейрофизиологии Йельского университета, а в 1941 перешёл на факультет психиатрии Иллинойсского университета.

Уоррен Мак-Каллок

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

И опять Летвин знакомит Питтса с человеком, с которым ему предстоит работать с Винером. История повторяется Винер остаётся так впечатлён талантом юноши, что предлагает ему позицию аспиранта в MIT, несмотря на отсутствие у Питтса формального образования. В 1943-го году они начинают работать вместе над математическим моделированием мозга. Винер надеялся помочь Питтсу своими знаниями теории вероятностей и статистики, так как понимал, что нейронные сети могут лечь в основу вычислительных машин, а это предвещало кибернетическую революцию.

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

Винер был обеспокоен недостаточным прогрессом своего ученика в работе над диссертацией и считал, что корнем проблемы является разрушительное влияние приятелей Питтса Летвина и Оливера Селфриджа, которые постоянно ввязывались в различные авантюры. Одна из них касалось геологии. Питтс был уверен, что в скалах Массачусетса должны быть изумруды, и с помощью Селфриджа раздобыл динамит, чтобы взорвать его в предполагаемом месте их залегания. В результате последовавшего взрыва Питтс сломал руку. Другой авантюрой стал дебют Летвина и Питтса в роли начинающих сценаристов в Голливуде. Они написали пьесу Шестое королевство о не говорящем по-английски человеке из Польши, который посещает врача с жалобой на головную боль и в результате серии недоразумений оказывается в сумасшедшем доме.

Однажды Питтс забыл в камере хранения чемодан с манускриптом статьи, который Винер дал ему на вычитку. После долгой череды приключений статью удалось вернуть, но Винер был сильно рассержен: он опасался, что из-за досадной задержки с публикацией результатов его опередит Клод Шеннон, который также работал над этой темой.

Впрочем, Винер и сам был знаменит своей рассеянностью, история сохранила множество забавных воспоминаний современников об этом. Например, Роберт Фано, коллега Винера, профессор электротехники и информатики в MIT, рассказывал, что однажды в конце беседы в институтском коридоре, Винер спросил своего собеседника, в каком направлении он шёл и, услышав ответ, сказал: Хорошо! Это значит, что я уже пообедал.


Норберт Винер
Источник фото


Тем временем, Мак-Каллок перебрался к Питтсу в Бостон, получив щедрый грант на исследование мозга в стенах MIT. На дверях кабинета коллег красовалась надпись Экспериментальная эпистемология. Будучи воодушевлёнными таким успехом, они пишут Винеру и Розенблюту, его коллеге, письмо в шуточном тоне, которое начинается со слов Знайте, о благороднейшие, великодушные и могущественные лорды.... Это шуточное послание совершенно неожиданно для его авторов стало спусковым крючком цепи нелепых событий, изменивших судьбу Мак-Каллока и Питтса, а также, возможно, пути развития науки на заре нейросетевой эры.

Винер в то время пребывал в состоянии депрессии издательства, ещё вчера конкурировавшие за право издать его Кибернетику, одно за другим отказывались публиковать автобиографию учёного. В ней он довольно неоднозначно отзывался о некоторых своих коллегах, и никто из издателей не хотел скандала. Жена Винера Маргарет решила, что это подходящий момент для того, чтобы поссорить его с коллегами, которые по её мнению оказывали на Винера плохое влияние. Маргарет рассказывает мужу удивительную историю о том, что несколькими годами ранее, когда их дочь Барбара несколько месяцев жила на ранчо Мак-Каллоков перед поступлением в университет, Летвин и Питтс якобы много раз соблазняли их дочь. Депрессия, прошлые обиды из-за статьи, ужасный рассказ жены всё это привело Винера в состояние, в котором шутливое письмо стало последней каплей. Он в довольно резком тоне попросил передать бывшим товарищам, что с этого момента никакого сотрудничества между ними быть не может.

Ссора с Винером сильно подкосила Питтса. На это наложились и научные неудачи. Результат его с Летвином эксперимента над зрением лягушек плохо согласовывался с предположениями Питтса и Мак-Каллока. Товарищи показывали амфибиям разные источники света, картинки из их естественной среды, троллили их управляемыми искусственными мухами на магнитах. Летвин записывал сигналы, передаваемые глазом в мозг, и сопоставлял их с использованными стимулами. Оказалось, глаз не просто регистрирует видимое, но фильтрует и анализирует информацию о визуальных характеристиках о контрастности, изгибах и движении! В будущем результаты этих исследований были изложены в ставшей классической статье Что сообщает глаз лягушки мозгу лягушки (1959).


Джером Летвин (слева) и Уолтер Питтс
Источник фото

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

Питтс уничтожил свою недописанную диссертацию, стал много пить и почти забросил науку. В 1964-м году во время лекционного тура в Стокгольм остановилось сердце 70-летнего Винера. А в мае 1969-го, в возрасте 46 лет, умирает Питтс. Мак-Каллок пережил его лишь на несколько месяцев и умер в сентябре 1969-го.

В субботу, 21 апреля 1969 года, дрожащей рукой алкоголика, Питтс передал письмо из своей палаты в больнице Бет-Исраэль в палату Мак-Каллока в отделении интенсивной терапии сердца в госпитале Бригама: Я понимаю, что у тебя был лёгкий коронарный приступ; что ты присоединен ко множеству датчиков, подключенных к панелям и сигналам тревоги, которые постоянно контролирует медсестра, и, в силу этого, ты не можешь перевернуться в постели. Без сомнения, это кибернетика. Но всё это вызывает во мне ужасную грусть.

Лишь Летвин надолго пережил своих товарищей и умер в 2011-м. Во многом благодаря ему мы и знаем подробности жизни этих выдающихся людей.

Что же такого в работе Мак-Каллока и Питтса?


Уоррен Мак-Каллок ещё до встречи с Питтсом задавался вопросом, как можно описать причинную структуру нейронных событий и вывести логическую теорию знания. Он пытался найти то, что сам же назвал психоном, элементарную единицу нервной деятельности. Отчасти он был вдохновлён попытками Лейбница представить человеческое знание при помощи универсального символьного языка. Но не он один ставил себе такие задачи. Николай Рашевский и его группа математической биофизики занималась похожими вещами, за исключением того, что они пытались работать с гладкими функциями и дифференциальным исчислением, в то время как Мак-Каллок хотел использовать математическую логику и булеву алгебру. Такие схожие мысли пришли в голову двум разным людям неспроста: на тот момент совсем недавно сделали свои открытия Ричард Катон, Сантьяго Рамон-и-Кахаль, Луи Лапик, а затем и Ханс Бергер.

В современных учебниках нейрон Мак-Каллока и Питтса очень часто описывается неправильно. То, что приводится в качестве схемы работы этого нейрона, в действительности является описанием нейрона розенблаттовского перцептрона.

Важно понимать, что в нейроне Мак-Каллока и Питтса нет привычных нам изменяемых синаптических весов. Принцип работы нейрона Мак-Каллока и Питтса формулируется следующим образом: нейрон x срабатывает на шаге t, если соблюдаются два условия: 1) нет ни одного нейрона, связанного с нейроном x ингибирующей связью, сработавшего на шаге t 1, и 2) число нейронов, связанных с нейроном x возбуждающей связью и сработавших на шаге t 1, больше .

Вместо суммирования входящих сигналов, умноженных на соответствующие синаптические веса, есть подсчёт числа сработавших нейронов, связанных с данным возбуждающей связью, и сравнение их с пороговой величиной. При этом ингибирующая связь полностью запрещает срабатывание нейрона. Нейрон Мак-Каллока и Питтса это полностью дискретная модель, созданная вполне в духе символьной логики Рассела и Уайтхеда. Конечно, нейрон Мак-Каллока и Питтса при ближайшем рассмотрении оказывается частным случаем нейрона Розенблатта, на который наложены дополнительные ограничения. Синаптические веса в нём могут принимать значения равные лишь 1 или .

В сетях Мак-Каллока и Питтса изначально в принципе отсутствует механизм обучения первые попытки придумать такой механизм были предприняты лишь во второй половине 1940-х годов (работы Шимбела и Раппопорта). Дискретное наследие сетей Мак-Каллока и Питтса ещё долго тяготело над нейросетевыми исследованиями. Даже Розенблатт, сделавший под влиянием работ Хебба, Фарли, Кларка и Рочестера серьёзный шаг вперёд в обучении нейронных сетей, доказав теорему о сходимости перцептрона, не смог полностью преодолеть ментальный фреймворк символьного подхода в его перцептронах функции активации так и остались ступенчатыми, что делало невозможным применение методов градиентного спуска для обучении нейронных сетей. Именно поэтому проблема обучения многослойных перцептронов так и не была решена им в удовлетворительной мере. Впрочем, работа Фрэнка Розенблатта заслуживает как минимум одного отдельного поста.

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

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

На ранних этапах своей работы Мак-Каллок столкнулся с проблемой петель (или кругов, как он их называл). Поведение линейной цепи без петель (сейчас мы называем такие сети сетями прямого распространения feedforward neural networks) более-менее понятно, сигналы передаются от предшествующих в цепочке нейронов к следующим за ними и так далее. Моменту обработки каждого нейрона можно строго сопоставить некоторый момент времени t (сегодня мы говорим о t как о номере слоя сети, в котором находится нейрон). Однако как только в сети появлялись циклы (то есть сеть в современных терминах становилась рекуррентной), величина t теряла свой смысл. Кстати, существование петель в нейронных сетях мозга тогда ещё ставили под вопрос. Если они и существуют, предполагали тогда, наверное, именно они и вызывают эпилепсию. Сейчас-то мы знаем, что эпилепсия вызвана рядом других механизмов!

Именно в момент теоретического кризиса, вызванного проблемой петель, на помощь Мак-Каллоку пришёл Питтс. Он отлично знал логику, неудивительно, ведь он был учеником Рудольфа Карнапа одного из крупнейших специалистов в области формальной логики и ведущего представителя логического позитивизма. Именно карнаповский Язык-II (Language II) было решено использовать в дальнейшем для нотации. Но в итоге он оказался настолько сложен, что даже самым крутым математикам непросто его читать, да и авторы из-за этого допустили несколько ошибок.

Кроме того, Питтс до этого написал три статьи на связанные темы. Для решения задачи петель он предложил выделить подмножество циклических нейронов (на рис. 1 это нейроны 1 и 2), и для них необходимо:

1. Найти количество шагов N такое, чтобы состояния этих нейронов N шагов назад определяли их текущие состояния.

2. Найти для этих нейронов все возможные комбинации состояний и показать, как они меняются через каждые N шагов.

3. Связать сеть с конкретным утверждением, которое нужно проверить.

рис. 1

Определим N для этой сети, оно будет равно двум (то есть, состояние циклических нейронов будет зависеть от состояния два шага назад). Затем опишем все возможные состояния этой сети X.

X_1(t) = N_1(t) и N_2(t) (то есть оба нейрона активировались во время t)
X_2(t) = N_1(t) и не N_2(t)
X_3(t) = не N_1(t) и N_2(t)
X_4(t) = не N_1(t) и не N_2 (t) (ни один из двух нейронов не активировался во время t)

Дальше мы можем сопоставить сеть с определённым утверждением и проверить, является ли X_i (t) истинным или ложным.

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

***

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

Кстати, в третьей части своей статьи исследователи предлагают распространить результаты своих наработок и на то, что мы бы сейчас назвали гуманитарными и социальными разделами психологии. Они, например, говорят, что их теории достаточно, чтобы описать и бихевиоризм, и интроспективную психологию, и физиологическую. Более того, они утверждают, что психиатру совсем не обязательно знать личное прошлое пациента, чтобы поставить диагноз, так как нейронная сеть определяется её текущим состоянием и текущими входными сигналами (это, вероятно, камень в огород Фрейда, который многое объяснял событиями из детства).

Модель Мак-Каллока и Питтса оказала огромное влияние на дальнейшее развитие информатики, но, возможно, вовсе не так, как принято писать в институтских учебниках. Конечно, её появление повлияло на дальнейшее развитие искусственных нейронных сетей, однако не меньшее влияние она оказала на развитие электронной вычислительной техники и классических символьных вычислений. Знаменитый Отчёт от EDVAC, ставший продуктом труда Джона фон Неймана и его коллег и впервые сделавший достоянием общественности классическую архитектуру фон Неймана, содержит единственную ссылку на работы других исследователей. И это ссылка на статью Мак-Каллока и Питтса. Сигнал, циркулирующий в петлевом контуре нейронной сети, стал для фон Неймана прообразом оперативной памяти цифровой машины.

Именно статья Мак-Каллока и Питтса стала в начале 1950 отправной точкой для одной из фундаментальных работ Стивена Клини. Он, в отличие от фон Неймана, не считал вопрос о тьюринг-полноте сетей Мак-Каллока и Питтса самоочевидным и решил построить формальное доказательство. Он определил понятие регулярные события [regular events] (сегодня называемые регулярными языками [regular languages], рациональными языками [rational languages] или регулярными множествами [regular sets]) и доказал, что сети Мак-Каллока и Питтса могут представлять [represent] регулярные события (в современной терминологии они могут принимать [accept] регулярные языки). Именно от этого термина происходит понятие регулярные выражения [regular expressions], хорошо известный большинству современных программистов.

Теперь, каждый раз набирая в ноутбуке строку import re, вы просто обязаны вспомнить добрым словом двух романтиков эпохи первых нейронных сетей.

Забавно, что термин регулярные в отношении событий, языков, множеств и выражений, является хорошей иллюстрацией принципа нет ничего более постоянного, чем временное. В своей работе Клини пишет: Сейчас мы опишем класс событий, которые будем называть регулярными событиями (мы будем рады любым предложениям относительно более наглядного термина). Как видим, за 70 лет подходящих предложений не поступило. Прилагательное regular в английском языке имеет несколько значений. Это и регулярный, и обычный, и очередной, и правильный, и даже официальный. Что именно из этого имел в виду Клини? Этим вопросом исследователи задаются и в наши дни. По всей видимости, он хотел указать на то, что эти события обязательно происходят всякий раз, когда модель находится в одном и том же состоянии и получает на вход один и тот же сигнал.

В той же статье Клини также определил альтернативный формализм, являющийся обобщением сетей Мак-Каллока и Питтса, позволив ячейкам (то есть нейронам) сети принимать любые из конечного числа внутренних состояний. Клини назвал свой новый формализм конечными автоматами [finite automata] и показал, что сети Мак-Каллока и Питтса вычислительно эквивалентны конечным автоматам.

И на сладкое: Питтс и Летвин пробовали себя в роли сценаристов, а Мак-Каллок писал стихи. Поистине универсальные умы, сочетающие в себе и физику, и лирику!

Вот один из опусов Мак-Каллока в переводе Сергея Маркова:

Мы замки на небе возводим,
И не растаять им в пыли,
Пока мы ими сумасбродим,
Пока с ума нас не свели.

Таскай их (жребий безысходен)
По разным уголкам Земли.
Мы замки на небе возводим,
И не растаять им в пыли.

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

Звук. От механических колебаний до ALSA SoC Layer

22.09.2020 10:23:41 | Автор: admin


Мы в SberDevices делаем устройства, на которых можно послушать музыку, посмотреть кино и ещё много всего. Как вы понимаете, без звука это всё не представляет интереса. Давайте посмотрим, что происходит со звуком в устройстве, начиная со школьной физики и заканчивая ALSA-подсистемой в Linux.

Что же такое звук, который мы слышим? Если совсем упрощать, то это колебания частиц воздуха, которые доходят до нашей барабанной перепонки. Мозг их, разумеется, потом переводит в приятную музыку или в звук проезжающего за окном мотоциклиста, но давайте пока остановимся на колебаниях.

Люди ещё в 19 веке поняли, что можно попытаться записать звуковые колебания, а потом их воспроизвести.

Для начала посмотрим, как работало одно из первых звукозаписывающих устройств.


Фонограф и его изобретатель Томас Эдисон
Источник фото

Тут всё просто. Брали какой-нибудь цилиндр, обматывали фольгой. Потом брали что-нибудь конусообразное (чтобы было погромче) с мембраной на конце. К мембране присоединена маленькая иголка. Иголку прислоняли к фольге. Потом специально обученный человек крутил цилиндр и что-нибудь говорил в резонатор. Иголка, приводимая в движение мембраной, делала в фольге углубления. Если достаточно равномерно крутить цилиндр, то получится намотанная на цилиндр зависимость амплитуды колебаний мембраны от времени.



Чтобы проиграть сигнал, надо было просто прокрутить цилиндр ещё раз с начала иголка будет попадать в углубления и передавать записанные колебания в мембрану, а та в резонатор. Вот мы и слышим запись. Можно легко найти интересные записи энтузиастов на ютубе.

Переход к электричеству


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



Чтобы можно было хранить такое представление колебаний в памяти компьютера, их надо дискретизировать. Этим занимается специальная железка аналогово-цифровой преобразователь (АЦП). АЦП умеет много раз за одну секунду запоминать значение напряжения (с точностью до разрешения целочисленной арифметики АЦП) на входе и записывать его в память. Количество таких отсчётов за секунду называется sample rate. Типичные значения 8000 Hz 96000 Hz.

Не будем вдаваться в подробности работы АЦП, потому что это заслуживает отдельной серии статей. Перейдём к главному весь звук, с которым работают Linux-драйверы и всякие устройства, представляется именно в виде зависимости амплитуды от времени. Такой формат записи называется PCM (Pulse-code modulation). Для каждого кванта времени длительностью 1/sample_rate указано значение амплитуды звука. Именно из PCM состоят .wav-файлы.

Пример визуализации PCM для .wav-файла с музыкой, где по горизонтальной оси отложено время, а по вертикальной амплитуда сигнала:



Так как на нашей плате стереовыход под динамики, надо научиться хранить в одном .wav-файле стереозвук: левый и правый канал. Тут всё просто сэмплы будут чередоваться вот так:



Такой способ хранения данных называется interleaved. Бывают и другие способы, но сейчас их рассматривать не будем.

Теперь разберёмся, какие электрические сигналы нам нужны, чтобы можно было организовать передачу данных между устройствами. А нужно не много:

  1. Bit Clock(BCLK) тактирующий сигнал (или клок), по которому аппаратура определяет, когда надо отправить следующий бит.
  2. Frame Clock (FCLK или его ещё называют LRCLK) тактирующий сигнал, по которому аппаратура понимает, когда надо начать передавать другой канал.
  3. Data сами данные.



Например, у нас есть файл со следующими характеристиками:
  • sample width = 16 bits;
  • sampling rate = 48000 Hz;
  • channels = 2.

Тогда нам надо выставить следующие значения частот:
  • FCLK = 48000 Hz;
  • BCLK = 48000 * 16 * 2 Hz.

Чтобы передавать ещё больше каналов, используется протокол TDM, который отличается от I2S тем, что FCLK теперь не обязан иметь скважность 50%, и восходящий фронт лишь задаёт начало пакета сэмплов, принадлежащих разным каналам.

Общая схема


Под рукой как раз оказалась плата amlogic s400, к которой можно подключить динамик. На неё установлено ядро Linux из upstream. На этом примере и будем работать.

Наша плата состоит из SoC (amlogic A113x), к которому подключен ЦАП TAS5707PHPR. И общая схема выглядит следующим образом:

Что умеет SoC:
  • SoC имеет 3 пина: BCLK, LRCLK, DATA;
  • можно сконфигурировать CLK-пины через специальные регистры SoC, чтобы на них были правильные частоты;
  • ещё этому SoC можно сказать: Вот тебе адрес в памяти. Там лежат PCM-данные. Передавай эти данные бит за битом через DATA-линию. Такую область памяти будем называть hwbuf.

Чтобы воспроизвести звук, Linux-драйвер говорит SoC, какие нужно выставить частоты на линиях BCLK и LRCLK. К тому же Linux-драйвер подсказывает, где находится hwbuf. После этого ЦАП (TAS5707) получает данные по DATA-линии и преобразует их в два аналоговых электрических сигнала. Эти сигналы потом передаются по паре проводов {analog+; analog-} в два динамика.

Переходим к Linux


Мы готовы перейти к тому, как эта схема выглядит в Linux. Во-первых, для работы со звуком в Linux есть библиотека, которая размазана между ядром и userspace. Называется она ALSA, и рассматривать мы будем именное её. Суть ALSA в том, чтобы userspace и ядро договорились об интерфейсе работы со звуковыми устройствами.

Пользовательская ALSA-библиотека взаимодействует с ядерной частью с помощью интерфейса ioctl. При этом используются созданные в директории /dev/snd/ устройства pcmC{x}D{y}{c,p}. Эти устройства создаёт драйвер, который должен быть написан вендором SoC. Вот, например, содержимое этой папки на amlogic s400:

# ls /dev/snd/controlC0    pcmC0D0p   pcmC0D0с   pcmC0D1c   pcmC0D1p   pcmC0D2c

В названии pcmC{x}D{y}{c,p}:
X номер звуковой карты (их может быть несколько);
Y номер интерфейса на карте (например, pcmC0D0p может отвечать за воспроизведение в динамики по tdm интерфейсу, а pcmC0D1c за запись звука с микрофонов уже по другому аппаратному интерфейсу);
p говорит, что устройство для воспроизведения звука (playback);
c говорит, что устройство для записи звука (capture).

В нашем случае устройство pcmC0D0p как раз соответствует playback I2S-интерфейсу. D1 это spdif, а D2 pdm-микрофоны, но о них мы говорить не будем.

Device tree


Описание звуковой карты начинается с device_tree [arch/arm64/boot/dts/amlogic/meson-axg-s400.dts]:
sound {    compatible = "amlogic,axg-sound-card";    model = "AXG-S400";    audio-aux-devs = <&tdmin_a>, <&tdmin_b>,  <&tdmin_c>,             <&tdmin_lb>, <&tdmout_c>;                      dai-link-6 {        sound-dai = <&tdmif_c>;        dai-format = "i2s";        dai-tdm-slot-tx-mask-2 = <1 1>;        dai-tdm-slot-rx-mask-1 = <1 1>;        mclk-fs = <256>;        codec-1 {            sound-dai = <&speaker_amp1>;        };    };               dai-link-7 {        sound-dai = <&spdifout>;        codec {            sound-dai = <&spdif_dit>;        };    };    dai-link-8 {        sound-dai = <&spdifin>;        codec {            sound-dai = <&spdif_dir>;        };    };    dai-link-9 {        sound-dai = <&pdm>;        codec {            sound-dai = <&dmics>;        };    };};&i2c1 {    speaker_amp1: audio-codec@1b {        compatible = "ti,tas5707";        reg = <0x1b>;        reset-gpios = <&gpio_ao GPIOAO_4 GPIO_ACTIVE_LOW>;        #sound-dai-cells = <0>;                   };};&tdmif_c {    pinctrl-0 = <&tdmc_sclk_pins>, <&tdmc_fs_pins>,            <&tdmc_din1_pins>, <&tdmc_dout2_pins>,            <&mclk_c_pins>;    pinctrl-names = "default";    status = "okay";};

Тут мы видим те 3 устройства, которые потом окажутся в /dev/snd: tdmif_c, spdif, pdm.

Устройство, по которому пойдёт звук, называется dai-link-6. Работать оно будет под управлением TDM-драйвера. Возникает вопрос: вроде мы говорили про то, как передавать звук по I2S, а тут, вдруг, TDM. Это легко объяснить: как я уже писал выше, I2S это всё тот же TDM, но с чёткими требованиями по скважности LRCLK и количеству каналов их должно быть два. TDM-драйвер потом прочитает поле dai-format = i2s; и поймёт, что ему надо работать именно в I2S-режиме.

Далее указано, какой ЦАП (внутри Linux они входят в понятие кодек) установлен на плате с помощью структуры speaker_amp1. Заметим, что тут же указано, к какой I2C-линии (не путать с I2S!) подключен наш ЦАП TAS5707. Именно по этой линии будет потом производиться включение и настройка усилителя из драйвера.

Структура tdmif_c описывает, какие пины SoC будут выполнять роли I2S-интерфейса.

ALSA SoC Layer


Для SoC, внутри которых есть поддержка аудио, в Linux есть ALSA SoC layer. Он позволяет описывать кодеки (напомню, что именно так называется любой ЦАП в терминах ALSA), позволяет указывать, как эти кодеки соединены.

Кодеки в терминах Linux kernel называются DAI (Digital Audio Interface). Сам TDM/I2S интерфейс, который есть в SoC, тоже называется DAI, и работа с ним проходит схожим образом.

Драйвер описывает кодек с помощью struct snd_soc_dai. Самая интересная часть в описании кодека операции по выставлению параметров передачи TDM. Находятся они тут: struct snd_soc_dai -> struct snd_soc_dai_driver -> struct snd_soc_dai_ops. Рассмотрим самые важные для понимания поля (sound/soc/soc-dai.h):

struct snd_soc_dai_ops {    /*     * DAI clocking configuration.     * Called by soc_card drivers, normally in their hw_params.     */    int (*set_sysclk)(struct snd_soc_dai *dai,        int clk_id, unsigned int freq, int dir);    int (*set_pll)(struct snd_soc_dai *dai, int pll_id, int source,        unsigned int freq_in, unsigned int freq_out);    int (*set_clkdiv)(struct snd_soc_dai *dai, int div_id, int div);    int (*set_bclk_ratio)(struct snd_soc_dai *dai, unsigned int ratio);    ...
Те самые функции, с помощью которых выставляются TDM-клоки. Эти функции обычно имплементированы вендором SoC.

...int (*hw_params)(struct snd_pcm_substream *,    struct snd_pcm_hw_params *, struct snd_soc_dai *);...
Самая интересная функция hw_params().
Она нужна для того, чтобы настроить всё оборудование SoC согласно параметрам PCM-файла, который мы пытаемся проиграть. Именно она в дальнейшем вызовет функции из группы выше, чтобы установить TDM-клоки.

...int (*trigger)(struct snd_pcm_substream *, int,    struct snd_soc_dai *);...
А эта функция делает самый последний шаг после настройки кодека переводит кодек в активный режим.

ЦАП, который будет выдавать аналоговый звук на динамик, описывается ровно такой же структурой. snd_soc_dai_ops в этом случае будут настраивать ЦАП на прием данных в правильном формате. Такая настройка ЦАП как правило осуществляется через I2C-интерфейс.

Все кодеки, которые указаны в device tree в структуре,
dai-link-6 {    ...    codec-1 {        sound-dai = <&speaker_amp1>;    };};

а их может быть много, добавляются в один список и прикрепляются к /dev/snd/pcm* устройству. Это нужно для того, чтобы при воспроизведении звука ядро могло обойти все необходимые драйверы кодеков и настроить/включить их.

Каждый кодек должен сказать какие PCM-параметры он поддерживает. Это он делает с помощью структуры:
struct snd_soc_pcm_stream {    const char *stream_name;    u64 formats;            /* SNDRV_PCM_FMTBIT_* */    unsigned int rates;     /* SNDRV_PCM_RATE_* */    unsigned int rate_min;      /* min rate */    unsigned int rate_max;      /* max rate */    unsigned int channels_min;  /* min channels */    unsigned int channels_max;  /* max channels */    unsigned int sig_bits;      /* number of bits of content */};

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

Соответствующую реализацию TDM-драйвера для amlogic s400 можно посмотреть в sound/soc/meson/axg-tdm-interface.c. А реализацию драйвера кодека TAS5707 в sound/soc/codecs/tas571x.c

Пользовательская часть


Теперь посмотрим что происходит, когда пользователь хочет проиграть звук. Удобный для изучения пример реализации пользовательской ALSA это tinyalsa. Исходный код, относящийся ко всему нижесказанному, можно посмотреть там.
В комплект входит утилита tinyplay. Чтобы проиграть звук надо запустить:

bash$ tinyplay ./music.wav -D 0 -d 0
(-D и -d параметры говорят, что звук надо проигрывать через /dev/snd/pcmC0D0p).

Что происходит?
Вот краткая блок-схема, а потом будут пояснения:



  1. [userspace] Парсим .wav header, чтобы узнать PCM-параметры (sample rate, bit width, channels) воспроизводимого файла. Складываем все параметры в struct snd_pcm_hw_params.
  2. [userspace] Открываем устройство /dev/snd/pcmC0D0p.
  3. [userspace] Обращаемся к ядру с помощью ioctl(, SNDRV_PCM_IOCTL_HW_PARAMS ,), чтобы узнать поддерживаются такие PCM-параметры или нет.
  4. [kernel] Проверяем PCM-параметры, которые пытается использовать пользователь. Тут есть два типа проверок:
    • на общую корректность и согласованность параметров;
    • поддерживает ли каждый задействованный кодек такие параметры.
  5. настраиваем под них все кодеки, которые прикреплены к /dev/snd/pcmC0D0p интерфейсу (но пока не включаем), возвращаем успех.
  6. [userspace] выделяем временный буфер, куда будем класть PCM-данные.
  7. [userspace] отдаем заполненный временный буфер ядру с помощью ioctl(, SNDRV_PCM_IOCTL_WRITEI_FRAMES, ). Буква I в конце слова WRITEI указывает, что PCM-данные хранятся в interleaved-формате.
  8. [kernelspace] включаем кодеки, которые прикреплены к /dev/snd/pcmC0D0p интерфейсу, если они еще не включены.
  9. [kernelspace] копируем пользовательский буфер buf в hwbuf (см. пункт Общая схема) с помощью copy_from_user().
  10. [userspace] goto 6.

Реализацию ядерной части ioctl можно посмотреть, поискав по слову SNDRV_PCM_IOCTL_*

Заключение


Теперь у нас есть представление о том, куда попадает звук в Linux ядре. В следующих статьях будет разбор того, как звук проигрывается из Android-приложений, а для этого ему надо пройти ещё немалый путь.
Подробнее..

История нейронных сетей в СССР

25.02.2021 14:18:30 | Автор: admin
Сегодня нейронные сети широко известны благодаря достижениям таких учёных как Джеффри Хинтон, Йошуа Бенджио и Ян ЛеКун. Но далеко не все открытия в области коннекционизма сделаны на Западе. Над нейронными сетями начиная с конца 50-х годов активно работали и в Советском союзе, хотя за исключением специалистов сегодня немногие знают о подробностях этих исследований. Поэтому мы решили напомнить о работе советских учёных, рассказав историю отечественного коннекционизма.

Учёные Галушкин А.И. и Ивахненко А.Г.

1960-е стали золотым веком советской науки. К 1975 году от всего количества учёных в мире работала в СССР, при этом большое внимание уделялось точным наукам, плоды которых часто имели прикладное значение. Не обходили стороной и кибернетику, в которой видели огромный потенциал. Под влиянием военного и учёного Анатолия Китова она была реабилитирована после недолгой опалы. Шла работа в области автоматического управления, машинного перевода, сетевых технологий Сейчас бы мы сказали, что в СССР существовала целая школа искусственного интеллекта!

В рамках кибернетики развивалось и направление, которое мы привыкли называть нейросетевым. Юрген Шмитхубер, создатель известной нейросетевой архитектуры LSTM, известный в наши дни также как историк глубокого обучения, часто ссылается в своих выступлениях на вклад советских учёных в становление этого направления.

В 60-ые годы в СССР большими тиражами выходило несколько серьёзных тематических изданий, и, судя по наукометрической статистике, изрядная доля мировых коннекционистских исследований издавалась именно на русском языке. Коннекционизм в какой-то момент оказался настолько популярен, что им занялись не только в метрополии, но и в других городах и республиках, например в Армении и Грузии. К сожалению, пока что оцифрована лишь небольшая доля публикаций тех лет, большинство работ можно найти только в оффлайн-библиотеках.

Шла машина из Тамбова или чем занимался Маккарти в СССР


Несмотря на железный занавес, советские исследователи не варились в собственном соку. Существовал интенсивный обмен идеями между нашими и заграничными учёными. Если говорить про кибернетику, в 1965 году в рамках международного обмена группа западных исследователей посетила СССР. В составе делегации был и Джон Маккарти, автор термина искусственный интеллект. После открытия III Всесоюзного совещания по автоматическому управлению (технической кибернетике) в Одессе и его продолжения на пароходе Адмирал Нахимов, делегация отправилась в тур по советским научно-исследовательским институтам. Сначала они заехали в Киев и познакомились с академиком Виктором Глушковым, автором концепции ОГАС, а также с профессором Киевского политехнического института Алексеем Ивахненко, о котором речь пойдёт далее. Затем последовал визит в Тбилиси, где западных гостей встречал директор Института систем управления Академии наук Грузинской ССР Арчил Элиашвили. Там над многослойными (или, как их называли в советской литературе, многорядными) перцептронами работали исследователи, имена которых сейчас даже человеку, подкованному в теме, мало что скажут. Они занимались в том числе системами распознавания речи. Уинстон Нельсон (Winston Nelson) из Лаборатории Белла, участвовавший в делегации, описывает визит в грузинскую лабораторию так:
Там на полу был небольшой робот, и он передвигался согласно произносимым вслух командам. <...> А затем мы вернулись в офис директора, где стоял длинный стол, уставленный вазами с фруктами, хачапури и превосходным грузинским коньяком.

Помимо Одессы, Киева и Тбилиси, делегация посетила Баку, Москву, Минск, Ленинград и несколько других городов союзных республик. В Москве Маккарти встретился со своим старым знакомым академиком Андреем Ершовым. Коллеги познакомились в декабре 1958 года в Великобритании на Конференции по автоматизации мыслительных процессов. После визита в Москву Маккарти в сопровождении Ершова отправился в новосибирский Академгородок, откуда через Москву вернулся домой (в реалиях холодной войны, когда Новосибирск был одним из полузакрытых научных центров, Ершову стоило больших трудов согласовать этот визит).

Отношения между Ершовым и Маккарти, судя по их переписке, были вполне дружеские, а не только профессиональные. Например, Маккарти в одном из писем просит Ершова прислать запись песни Шла машина из Тамбова. Или вот другой пример: когда Маккарти гостил в Союзе, в рабочей группе Международной федерации по обработке информации произошёл конфликт относительно стандартов разработки языка Алгол 68. Тогда Никлаус Вирт откололся от большинства и начал работу над языком Паскаль. Маккарти и Ершов сочинили и записали в ответ на это шуточную песню, которую адресовали раскольникам. Маккарти привёз запись на плёнке на очередное заседание рабочей группы. Произведение исполнялось, как вспоминали авторы, на мелодию русской народной песни Это не я, глупышка (на самом деле имеется в виду песня It aint me, babe Боба Дилана). У песни был и английский, и русский варианты. Приведём припев последнего:

Подайте нам язык другой,
Чтобы не было в нем обмана,
Чтоб на нем могла писать
Любая обезьяна
Нет, нет, нет, это не наш язык


Через три года Маккарти ещё раз приехал в Академгородок теперь уже на два месяца и в качестве сотрудника Вычислительного центра: он прочитал курс по верификации программ в Новосибирском университете. В ходе одной из поездок Маккарти познакомился с Александром Кронродом, который работал над шахматной программой, наследницей которой стала знаменитая Каисса, и договорился о проведении первого в мире шахматного матча между компьютерными программами. В этом матче в 1967-м году советская шахматная программа, разработанная в Институте теоретической и экспериментальной физики, победила программу Стэнфордского университета со счётом 3-1.

Алексей Ивахненко и Метод группового учёта аргументов


В 1965-м году в издательстве Мир впервые увидел свет перевод на русский язык книги Фрэнка Розенблатта Принципы нейродинамики. Учитывая, что оригинал вышел в 1962-м, можно предположить, что переводить её начали почти сразу после английской публикации. Одним из самых горячих поклонников подхода, использованного Розенблаттом, в СССР стал Алексей Григорьевич Ивахненко. Он начал заниматься перцептронами ещё до выхода этой книги и был знаком с ранними публикациями Розенблатта. В момент выхода перевода Принципов нейродинамики Ивахненко уже был признанным учёным, его книга Техническая кибернетика, вышедшая до перевода принципов нейродинамики, не только выдержала два издания на русском языке, но также была опубликована на английском, немецком, болгарском, польском и румынском.

Киев: Гостехиздат УССР, 1962

Научный интерес Ивахненко к самоорганизующимся системам проявился ещё в 1950-е годы: в 1959 году он успешно собрал и испытал собственную версию перцептрона машину Альфа, названную, по всей видимости, в честь -перцептрона Розенблатта. С 1963 года Ивахненко работал под руководством знаменитого академика Виктора Михайловича Глушкова. Впрочем, в отношениях учёных не всё было гладко: в 1959 году Глушков пишет письмо коллеге, что в книге Ивахненко сделана попытка объявить элементарные самонастраивающиеся системы более высокими кибернетическими устройствами, чем вычислительные машины, которые якобы способны реализовать лишь жёсткие алгоритмы. Похоже, Глушков обвинял Ивахненко в желании подмять под себя кибернетику. Хотя, судя по другим свидетельствам, конфликт не был таким серьёзным, каким мог показаться. Один из сотрудников Ивахненко, Михаил Шлезингер, до работы с учёным был сотрудником института Глушкова, где занимался ничем иным, как симуляцией нейронных сетей на цифровой электронной машине Киев! Даже после перехода Ивахненко под руководство Глушкова работы над нейронными сетями не были прекращены. То есть, несмотря на разногласия, учёные продолжали работать вместе. Скорее всего, Глушков боялся, что приоритет будет неверно отдан развитию нейрокомпьютеров, с помощью которых большинство задач, особенно прикладных, на тот момент решить было нельзя. То есть, он скорее ратовал за правильное распределение ресурсов, чем за прекращение работы над нейронными сетями. Кстати, разногласия Глушкова и Ивахненко касались актуального и на сегодняшний день противопоставления символьного подхода и коннекционизма. Представителей последнего в СССР называли сторонниками недетерминистического подхода (в терминах Ивахненко подхода самоорганизации) в противовес детерминистическому символьному подходу. Споры эти в СССР, как и на Западе, носили весьма ожесточённый характер.

Важным результатом, полученным Ивахненко, стало создание и развитие Метода группового учёта аргументов (МГУА), одного из первых в истории алгоритмов глубокого обучения. Как и для Якова Цыпкина, для Ивахненко самообучение распознающей системы обозначало процесс автоматического, то есть проходящего без вмешательства человека, установления границы, разделяющей пространство входных сигналов и признаков на области, отвечающие отдельным образам. Уже в начале 1970-х годов Ивахненко и его коллегам удавалось обучать восьмислойные нейронные сети, в основе которых лежал искусственный нейрон, основанный на интерполяционном полиноме Колмогорова Габора.

Некоторые исследователи на Западе примерно в то же время или несколько раньше Ивахненко обучали сети с одним промежуточным слоем. Например, этим занимались коллеги Розенблатта Сэм Виглион (Sam S. Viglione) и Роджер Дэвид Джозеф (Roger David Joseph), в честь которых получил своё название алгоритм Джозефа Виглиона. Однако сети Ивахненко, содержащие восемь слоёв, явно опережали своё время. Впрочем, сами подходы, использованные им в МГУА и Виглионом с Джозефом, отдалённо напоминают друг друга. Алгоритм Джозефа Виглиона шаг за шагом генерирует и оценивает двухслойные нейронные сети с прямым распространением, автоматически идентифицируя небольшие подмножества признаков, которые обеспечивают лучшую классификацию примеров из обучающей выборки. Полученные сети затем подвергаются валидации (проверке) на части данных, не включенных в обучающую выборку. В МГУА в нейронную сеть на каждом шаге добавляются дополнительные слои, обучаемые с использованием регрессионного анализа (таким образом, МГУА восходит к методам, разработанным ещё в XIX веке в работах Лежандра и Гаусса). Затем применяется процедура сокращения слоя. Для этого точность предсказаний каждого из нейронов оценивается при помощи валидационной выборки, а затем наименее точные нейроны удаляются.

Книга Предсказание случайных процессов, написанная Ивахненко в соавторстве с Валентином Лапой и увидевшая свет в 1969 году, стала своеобразным компендиумом техник, исследовавшихся советскими коннекционистами, а книга 1971-го года Системы эвристической самоорганизации в технической кибернетике содержит не только подробное описание МГУА, но и множество примеров его применения для решения прикладных задач. В этой книге Ивахненко писал:
Уже в 1990-м году кибернетические системы автоматизированного управления производством (в масштабе завода, отрасли и всей страны) сократят потребность в рабочей силе на 50%, то есть, рабочая неделя может быть снижена до трёх рабочих дней.
Удивительно, как Ивахненко удалось угадать важнейшие тренды в развитии вычислительной техники!

Скриншот из книги с предполагаемой хронологией достижений ИИ.
Ивахненко А.Г., Лапа В.Г. Предсказание случайных процессов, издательство Наукова думка, 1971 г..

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

Хотя нейросетевые модели наших дней, лежащие в основе новой коннекционистской весны, лишь отдалённо похожи на сети, построенные при помощи МГУА, именно данный метод в некоторой степени стал поворотным пунктом в коннекционистских исследованиях. Исследователями в полной мере был осознан тот факт, что обучение глубоких нейронных сетей в принципе возможно, и что именно их использование может обеспечить прорывные результаты в решении тех или иных задач машинного обучения. Многие работы Ивахненко и его коллег были переведены на английский язык, и отсылки к ним мы можем увидеть в современных работах по глубокому обучению. Метод группового учёта аргументов используется исследователями и в наши дни, хотя занимается им лишь небольшое количество специалистов на территории бывшего СССР и в дальнем зарубежье. Кстати, несмотря на непопулярность метода, его реализация даже есть на гитхабе.

Метод без названия от Александра Галушкина


В августе 1974-го года тиражом 8 000 экземпляров вышла книга Александра Ивановича Галушкина, тогда сотрудника МФТИ, под названием Синтез многослойных систем распознавания образов. С точки зрения современной терминологии название книги можно понимать как Обучение многослойных нейронных сетей. Книга Галушкина стала первым систематическим изложением идей учёного, развитых им и его коллегами в предшествующие годы.


Москва: Энергия, 1974

Первые публикации Галушкина на тему создания и обучения многослойных нейронных сетей относятся к 19711973 годам. Учёный прекрасно знал о работах западных коннекционистов. Полюбуйтесь списком систем распознавания образов, который приводит Галушкин в своей книге: Mark-I, Mark-II, Papa, Kybertron, Altron, Konflex, Albert-1, Adalin, Madalin, Minos-2, Illiak-2, Illiak-3, Tobermory, GHILD, Astropower, Adapt-1, Adapt-2, DSK, Ziklop-1, Simisor, Auditran, Shubocs, Gaku и др.

Галушкин рассматривает использование в нейронных сетях функций активации, отличных от функции Хевисайда и сигнума (обозначается sgn, функция знака, имеющая три возможных значения: 0, 1 и 1). Необходимость применения функций с континуумом решений у Галушкина обосновывается следующим образом:

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

В итоге выбор автора останавливается на арктангенсе, умноженном на 2/ для приведения значений функции к диапазону (1;1). График арктангенса, как и график популярных в наши дни логистической функции и гиперболического тангенса, является сигмоидой.

Галушкин рассматривает задачу обучения нейронной сети в качестве задачи градиентного спуска. Он применяет цепное правило для вычисления градиента, подробно рассматривает случай обучения сетей с двумя обучаемыми слоями, а также коротко показывает, как следует решать задачу в случае многослойных сетей и сетей с рекуррентными связями, но не даёт используемому им методу какого-либо собственного названия. При этом вопрос конкретной топологии сетей в книге практически не затрагивается, зато уделено внимание сетям с переменным числом слоёв: Галушкин описывает подход, напоминающий МГУА с послойным обучением и постепенно наращиваемыми слоями. Автор также приводит результаты множества экспериментов по обучению сетей с различными параметрами процесса обучения, стремясь оценить их влияние на сходимость модели. Кроме математических моделей, Галушкин совместно с В. Х. Наримановым ещё в начале 1970-х годов сконструировал собственную версию аппаратного перцептрона.

Александр Иванович Галушкин продолжал работу над нейросетевыми технологиями до самого конца своей жизни и был одним из наиболее ярких лидеров этого направления в Советском союзе, а затем и в России, на протяжении более чем сорока лет. В 2007 году издательство Springer Science & Business Media выпустила книгу Галушкина Теория нейронных сетей [Neural Networks Theory] на английском языке с вводными словами Лотфи Заде, Сюнъити Амари и одного из знаменитых пионеров нейросетевого подхода Роберта Хехта-Нильсена (Robert Hecht-Nielsen, 19472019). В новом тысячелетии работы Галушкина неоднократно выходили в международных научных изданиях и оказали влияние на состояние современной нейросетевой науки.

Терминология имеет значение


В те годы и в западном, и в советском мире нейроны не называли нейронами: у Розенблата в Принципах нейродинамики они называются модулями (units), а то, что мы сейчас знаем как нейросети, в советской традиции имело несколько других названий. Многослойный перцептрон (multilayer perceptron) у Ивахненко назывался многорядным, вместо нейронов учёный использовал термин переменные, вместо сети фильтр. У Галушкина сеть называлась системой распознавания, нейрон линейно-пороговым элементом, а обученная сеть (то есть сеть, предназначенная только для выполнения [inference]) сетью с разомкнутым контуром. Почему учёные старались не использовать слово нейрон? А потому, что это отсылка к биологическому прототипу нейрону в коре головного мозга. Слои это тоже вполне нейробиологический термин, унаследованный от слоёв клеток коры головного мозга, поэтому у Ивахненко перцептрон многорядный.

Тенденции биологизаторства в СССР противостояли философы. Они видели в его проявлении редукционизм, сведение системы более высокой ступени организации к системе более низкой ступени. Точно так же, как жизнь человека нельзя свести к одним лишь биологическим процессам, нельзя даже в далёком приближении приравнивать вычислительную модель к реальному нейрону. Такая тенденция была характерна и для западной школы, но для советской школы она была более ярко выражена. Учёные подвергались большому давлению со стороны философов, которые критиковали любую попытку назвать какой-то технический предмет термином из арсенала биологов. Да и сами коннекционисты боялись повторять в названиях имена биологических прототипов, потому как это могло не только ввести людей в заблуждение, но и в ряде случаев исказить представление о самой научной работе. К счастью, табу на слово нейроны в информатике не помешало учёным вести исследования в области нейронных сетей.

Другой термин, достойный внимания это техническая кибернетика. Учёные, занимавшиеся вычислительной техникой в 1960-х, после смерти Норберта Винера не продолжили ассоциировать себя с кибернетикой. В Советском союзе же, вопреки распространённому мнению, что она была запрещена, кибернетика расцветала. Гонения на неё продолжались всего несколько месяцев, до момента, когда признанный специалист в области кибернетики, инженер-полковник Анатолий Китов написал статью Основные черты кибернетики. Парадоксальным образом Советский союз стал центром мировой кибернетики. Когда в 6070-ые годы у нас говорили об этой области, на Западе среди информатиков о ней уже мало кто вспоминал. Причём развивалась именно техническая кибернетика. Предметную область так назвали, чтобы отмежеваться от винеровского понятия кибернетики, которое подразумевало применение её техник в социальных науках. Техническая кибернетика изучала только технические системы управления.

Почему сейчас, когда вспоминают о нейронных сетях, никто не говорит про кибернетиков? Почему на западе компьютерные учёные перестали называть себя таковыми? Почему это название ушло в небытие, хотя наука продолжала развиваться? Ведь к области кибернетики можно отнести и первые нейросетевые эксперименты: Мак-Каллок и Питтс были регулярными участниками конференций Мейси и долгое время работали вместе с Норбертом Винером. Кибернетик У. Росс Эшби изучал мозг, и на основе своих наблюдений выдвинул концепцию суперстабильности систем, а также создал гомеостат одно из первых устройств, которое можно, хотя и с натяжкой, отнести к аппаратному воплощению искусственной нейронной сети. Аналогия с нейронным сетями прослеживается и в устройстве машин Грея Уолтера. Возможно, дело в том, что компания кибернетиков со временем стала относительно малочисленной (после ссоры Винера с Мак-Каллоком и Питтсом круг кибернетиков значительно поредел) и разбросанной по миру: Эшби, Грей Уолтер и Стаффорд Бир работали в Великобритании (какое-то время Бир провёл в Чили, где в годы президентства Сальвадора Альенде предпринял попытку создания кибернетической системы для управления экономикой, но её реализация была прервана приходом к власти хунты Пиночета). Американские поствинеровские кибернетики занимались в основном биологическими системами. Математиков и людей, занимающихся вычислительной техникой, среди них было мало. Естественным путём пальма первенства перешла к тем, кто тогда работал над решением прикладных задач при помощи компьютеров. А решались они главным образом при помощи символьных методов. Коннекционисты второго поколения в 70-е также по разным причинам отошли от дел. Бернард Уидроу занялся бизнесом, Розенблатт погиб, исследователи из Стэнфордского исследовательского института (SRI) переключились на символьные методы. Провал на Западе длился порядка пяти лет и закончился в 1978-ом году, когда темой занялись Дэвид Румельхарт, Джеффри Хинтон и их коллеги. Таким образом на время пальму первенства в мире ИИ перехватил Марвин Минский и Массачусетский институт технологий. Научная традиция пресеклась, и признанные специалисты в области IT были уже не из круга кибернетиков.

***
Советская коннекционистская традиция, в отличие от западной, была непрерывной. И Галушкин, и Ивахненко занимались своими разработками до последнего времени (Александр Галушкин умер несколько лет назад, а Алексей Ивахненко в начале 2000-х). Да и их коллеги в других институтах продолжали исследования в области коннекционизма. Правда, бюджеты, выделяемые на это направление, были довольно скромны, так как оно не считалось мейнстримным (появились другие, более перспективные направления, перетянувшие на себя основную часть ресурсов; к их числу относились базы знаний, функциональное и логическое программирование, экспертные системы, обработка естественного языка на основе регулярных грамматик и т. д.).

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

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

Как машины учатся эмоциональному поведению

09.04.2021 10:09:31 | Автор: admin
Нередко при взаимодействии с техникой люди проявляют эмоции: мы можем злиться на сломавшийся банкомат или умиляться пронырливости робота-пылесоса. Да, мы общаемся с роботами, но не стоит оценивать это общение как одностороннее: в логику аватаров, которые компании используют для взаимодействия с пользователем, часто бывает встроен навык понимания эмоций, и даже их проявления. Обычно это нужно, чтобы сделать общение приятным для клиента. Как же это всё работает?


Часто сюжеты фильмов и книг о роботах вращаются вокруг темы эмоций. Добрые роботы учатся у людей любви и самопожертвованию, а злые оказываются повержены из-за неспособности любить, жертвовать собой, предугадывать иррациональные поступки людей. Так, робот Вертер из фильма Гостья из будущего мучается из-за любви к Полине, а Электроник из одноименных Приключений в разные моменты фильма плачет, улыбается и смеётся, и в итоге именно это делает его человеком.

Смогут ли машины в самом деле испытывать эмоции? Ответить на этот вопрос будет трудно, покуда нам непонятна физиологическая составляющая эмоций. Если смотреть на эмоции широко, даже в поведении примитивных организмов наблюдаются явления, которые можно интерпретировать как эмоции. Например, у некоторых моллюсков в результате обучения формируются условные рефлексы, которые заставляют их избегать определённых стимулов. А что это, как не страх? Но оставим философствования философам, а современным учёным и разработчикам практические исследования. По данным последних, с уверенностью можно сказать, что машины можно научить распознавать эмоции и их симулировать.

Давайте разберёмся с тем, как смотрит на эмоции современная наука, и как эволюционировали научные воззрения на эмоциональную сферу человека.

Что такое эмоциональный интеллект?


Эмоциональный интеллект это умение распознавать свои и чужие эмоции и управлять ими. Корни этой концепции можно найти в трудах Чарльза Дарвина, который считал, что умение управлять эмоциями появилось в результате эволюции. Следующая попытка научного рассмотрения эмоций приходится на начало 1920-х годов: тогда появились первые работы, в которых способность людей выстраивать социальные взаимодействия рассматривалась как особый вид интеллекта. Тогда же американский психолог и педагог Эдвард Торндайк (Edward Lee Thorndike), который, кстати, изобрёл кривую обучения, ввёл понятие социальный интеллект, который определил как способность понимать людей, мужчин и женщин, мальчиков и девочек, умение обращаться с людьми и разумно действовать в отношениях с ними. Если задуматься, социальный интеллект имеет много общего с эмоциональным интеллектом, потому что существование последнего возможно только в обществе. Несмотря на то, что социальный интеллект это многомерное явление, исследователи постарались создать линейную шкалу, чтобы сравнивать людей по его уровню (да, люди часто стараются квантифицировать встречающиеся им явления, но в социальной сфере это особенно сложно). В 1926 году был создан один из первых тестов для измерения социального интеллекта Тест университета Джорджа Вашингтона на социальный интеллект. В последующее десятилетие предпринимались и другие попытки создания подобных тестов.

Термин эмоциональный интеллект (emotional intellect) впервые появился в работе Майкла Белдока (Michael Beldoch), написанной в 1964 году. Расцвет теории эмоционального интеллекта пришёлся на 1980-е и 1990-е годы. В 1983 году Говард Гарднер (Howard Earl Gardner) описал популярную модель интеллекта, где разделил навыки на внутриличностные и межличностные. С тех пор концепция интеллекта, связанного с социальными взаимодействиями, глубоко укоренилась в научном сообществе. В 1985 году Уэйн Пэйн (Wayne Leon Payne) защитил свою диссертацию, на основе которой написал статью, посвящённую развитию эмоционального интеллекта. В 1988 году психолог Рувен Бар-Он (Reuven Bar-On) ввёл понятие эмоционального коэффициента (EQ, emotional quotient), по аналогии с популярным показателем IQ. Современное представление об эмоциональном интеллекте окончательно оформилось в статье Эмоциональный интеллект американских социальных психологов Питера Саловея (Peter Salovey) и Джона Майера (John D. Mayer), увидевшей свет в 1990 году.

Эмоциональные вычисления


Теперь давайте перейдём к эмоциональным вычислениям. Созданием технологий, ответственных за обработку эмоциональной информации в системах ИИ, занимается направление, получившее название аффективные или эмоциональные вычисления (affective computing). Иногда также употребляются термины эмоциональный искусственный интеллект и искусственный эмоциональный интеллект, и хотя расстановка слов немного меняет смысл, специалисты ещё не договорились, какое из этих названий предпочтительнее.

Считается, что направление появилось в 1995 году с выходом в свет работы профессора Розалинды Пикард (Rosalind Wright Picard) из Медиа-лаборатории MIT.


Розалинда Пикард. Источник изображения.

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

Модели, предназначенные для распознавания эмоций, в наши дни обычно представляют собой рекуррентные, свёрточные или свёрточно-рекуррентные нейронные сети. А после 2017-го года к ним добавились ещё и трансформеры. Причём стоит заметить, что характерными маркерами эмоций могут быть не только лингвистические показатели (смысл слов и выражений), но и экстралингвистические, такие как тон голоса, интонации, выражение лица, динамика тела и жестикуляция. Эмоциональная информация разбросана по разным каналам: мы можем найти её и в звуке, и в видео. А если рассматривать сенсорную сферу, проявление эмоций можно найти в касаниях, и это тоже может быть важно для роботов. Ещё один канал, в котором эмоции проявляются на уровне активности мозга энцефалографический. Его можно использовать, например, при проектировании продвинутого детектора лжи. Одним из подразделов эмоционального ИИ является сентимент-анализ, цель которого определить, какая смысловая окраска у высказывания: негативная, нейтральная или позитивная. В наши дни эту задачу решают при помощи трансформерных моделей, подобных BERT. К сожалению, объём поста не позволяет рассказать об этом сейчас, и мы посвятим сентимент-анализу один из следующих материалов. В этом посте из всех каналов, которые задействуются при общении человека с машиной или людей друг с другом, мы рассмотрим только аудиальный канал.


Автор изображения: ioat/Shutterstock.com

Распознавание эмоций в речевом канале это одна из наиболее распространенных задач в области эмоционального ИИ. Чаще всего для построения модели применяются глубокие сети, которым на вход подаются различные представления звукового сигнала (спектрограммы, хромаграммы, последовательности наборов мел-кепстральных коэффициентов и т.п.). Такие модели решают задачу классификации или регрессии. Чтобы обучить модель, распознающую эмоциональную окраску речи, нужно подготовить обучающую выборку. А для этого нужно условиться, какое представление эмоций мы будем использовать. Возможные классификации предоставляет язык разметки EmotionML 1.0. Он содержит несколько эмоциональных словарей, основывающихся на научных классификациях. Одна из них это большая шестёрка эмоций (отвращение, печаль, гнев, страх, счастье и удивление) предложена в 1972 году в работе американского психолога Пола Экмана (Paul Ekman). Другой эмоциональный словарь, предусмотренный EmotionML 1.0, основан на концепции соответствия эмоций тенденциям действия [action tendencies], разработанной голландским психологом Нико Фрейдой (Nico Henri Frijda). Этот словарь включает в себя 12 эмоций: безразличие, высокомерие, гнев, желание, интерес, наслаждение, отвращение, покорность, смирение, страх, удивление и шок.

Есть много разных словарей, но наивным было бы считать, что их авторы просто соревновались друг с другом в составлении бессистемных списков эмоций. В основе больших эмоциональных словарей обычно лежит анализ лингвистических данных (статистики использования слов, используемых для передачи эмоциональной информации в различных языках). При этом сами словари нередко являются лишь побочным продуктом исследований, цель которых построить эмоциональное пространство, то есть такое представление, в котором каждая эмоция будет разделена на несколько независимых друг от друга компонент. Одну из попыток построить такое
пространство предпринял Джеймс Рассел (James A. Russell) в 1980 году. Он разложил эмоции по двум шкалам: первая, удовольствие-неудовольствие, характеризует позитивный или негативный характер эмоции, и вторая, возбуждение-сон, характеризует активность или пассивность психического состояния. Эта работа вызвала закономерную критику: мир эмоций не сводим к двумерному пространству. Критики предложили свою модель, уже не двухмерную, а в виде сетки, под названием GRID [сетка, решётка].

Так как у нас есть эмоциональный континуум, вместо задачи классификации, когда у нас есть несколько классов эмоций, мы сталкиваемся с задачей регрессии. В данном случае от модели требуется не предсказание метки конкретного эмоционального класса в соответствии с выбранным эмоциональным словарём, а оценка величины каждой из выбранных компонент эмоции. Для этой цели в стандарте EmotionML 1.0 введены системы измерений эмоций. Кроме упомянутой нами системы GRID (FRSE) с четырьмя шкалами, стандартом предусмотрена возможность использования пространства Удовольствие-Возбуждение-Доминирование (Pleasure, Arousal, and Dominance, PAD), основанного на трёх соответствующих шкалах, а также плоской шкалы интенсивности эмоции.

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

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

К счастью, на данный момент сформировано уже некоторое количество эмоциональных датасетов, на 2009-й год их было порядка сотни. Однако таких же объёмных, как ImageNet или LibriSpeech, для эмоциональной речи в публичном доступе так и не появилось.

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

1. RAVDESS состоит из записей 24 профессиональных актёров (12 мужчин и 12 женщин), озвучивающих две фразы (у двери разговаривают дети, собаки сидят у двери) на английском языке с североамериканским акцентом в двух вариантах: речь и пение, по две озвучки на каждый вариант. В качестве эмоционального словаря разметки использована большая шестёрка эмоций, к которой было добавлено спокойствие. Каждая фраза представлена в датасете двумя уровнями эмоциональной интенсивности для каждой из эмоций, а также однократно с нейтральной окраской. Каждая запись присутствует в датасете в трёх модальностях (только видео, только звук, звук вместе с видео). RAVDESS считается одним из наиболее качественных датасетов эмоциональной речи, но лексически он крайне беден.

2. SAVEE состоит из записей четырёх актёров-мужчин, говорящих на родном для них британском английском. В качестве эмоционального словаря снова выбрана большая шестёрка, при этом фразы с нейтральной эмоциональной окраской записывались дважды. Сами фразы были выбраны из корпуса TIMIT (датасет с записями 630 дикторов), для каждой эмоции было взято 15 фраз, при этом из них три были общими для всех эмоций, десять разными для разных эмоций, но без эмоциональной специфики, а ещё две фразы были основаны на текстах, имеющих специфическую эмоциональную окраску для данной эмоции (например, Кто одобрил счёт с неограниченным расходным лимитом? для эмоции гнев). К сожалению, объём этого датасета крайне мал, что создаёт проблемы для разработчиков.

3. SEMAINE это аудиовизуальная база данных, ставшая одним из продуктов исследовательской программы по созданию Чувствующего искусственного слушателя (Sensitive Artificial Listener, SAL) аудиовизуальной диалоговой системы, способной вовлечь человека в длительный эмоционально окрашенный разговор. По сути разговор с агентом SAL для человека напоминает обычный разговор при помощи системы видеосвязи с той лишь разницей, что собеседником является виртуальный персонаж, внешний облик которого (лицо, мимика, движения губ во время речи) в реальном времени генерируется при помощи библиотеки для трёхмерной визуализации. Данные, содержащиеся в базе SEMAINE, были получены в результате взаимодействия между пользователями и человеком-оператором, имитирующим чувствующего искушённого слушателя, а затем и ассистентом на базе нейросетевой модели. База включает записи 959 диалогов, в которых участвовало 150 человек. Длина каждой записи составляет около 5 минут. Все диалоги были расшифрованы и размечены при помощи эмоциональных меток (использовалась система с пятью шкалами и 27 эмоциональными классами). Для части записей присутствует разметка при помощи Системы кодирования лицевых движений (FACS). Используя FACS, можно с лёгкостью отличить, например, дежурную улыбку Pan-Am (называется в честь авиакомпании Pan-American Airways, стюардессы которой должны были улыбаться каждому пассажиру) от искренней улыбки Дюшена. Один из недостатков этого датасета в том, что различные эмоции представлены в SEMAINE крайне неравномерно, также никак не был сбалансирован ни состав участников исследования, ни лексическая основа диалогов. Тем не менее, нельзя не отметить удивительную детальность разметки.

4. TESS. В 1966 году исследователи из Северо-Западного университета разработали так называемый Слуховой тест 6, предназначенный для измерения чувствительности слуха пациентов. Набор фраз, используемых в тесте, состоит из так называемой фразы-носителя Скажи слово... и набора из 200 различных слов, которые добавляются к фразе-носителю. Исследователи из Университета Торонто использовали этот же набор текстов, при этом каждая из фраз произносилась двумя актрисами (26 и 64 лет; обе были из региона Торонто, являлись носительницами английского языка, имели высшее и высшее музыкальное образования) с семью различными типами эмоциональной окраски (использовалась всё та же большая шестёрка эмоций с добавлением нейтральной окраски). Таким образом, в сумме было получено 200 7 2 = 2 800 записей. Этот весьма скромный по размерам датасет, тем не менее, нередко используется исследователями и в наши дни.

5. EMO-DB это германоязычный массив данных, впервые представленный на конференции InterSpeech-2005. На протяжении многих лет он пользовался большой популярностью у исследователей эмоциональной речи. Десять актёров (5 женщин и 5 мужчин) имитировали эмоции, произнося по 10 предложений (5 коротких и 5 более длинных), относящихся к повседневному лексикону. Помимо звука были записаны электроглоттограммы. Электроглоттография основана на измерении динамики электрического сопротивления гортани во время произнесения фраз, что достигается при помощи пары электродов, располагаемых на передней поверхности шеи по обе стороны щитовидного хряща. 10 актёров 10 предложений 7 эмоций (включая нейтральную) дают нам 700 записей, однако часть записей была выполнена повторно, поэтому в базе содержится на 100 записей больше. Все записи были подвергнуты оценке с привлечением 20 оценщиков. После этого в записях со средним уровнем узнавания эмоции более 80% и средней оценкой убедительности более 60% разметчики дополнительно оценили интенсивность проявления эмоции. По современным меркам этот датасет невелик и может быть использован разве что в учебных целях.

6. IEMOCAP это массив, созданный Лабораторией анализа и интерпретации речи Университета Южной Калифорнии, включающий в себя записи диалогов (спонтанных и на основе заранее подготовленных сценариев) десяти участников. Данные состоят из аудиозаписи с расшифровкой, видео, а также подробной информации о выражении лица и движениях рук, а также эмоциональной разметки (большая шестёрка + другая эмоция + нейтральная окраска, а также оценка эмоций по трём шкалам валентность, активация и доминирование). Общий объём корпуса составляет около 12 часов.

7. RUSLANA первая открытая русскоязычная база данных эмоциональной речи. Была создана в 2002 году. RUSLANA содержит записи 61 человека (12 мужчин и 49 женщин), которые произносили десять предложений с выражением следующих эмоциональных состояний: удивление, счастье, гнев, грусть, страх и нейтрально (без эмоциональной окраски). Таким образом, база содержит в сумме 61 10 6 = 3 660 записей. Хотя с момента появления RUSLANA свет увидели ещё несколько открытых русскоязычных эмоциональных датасетов, например, аудиовизуальный RAMAS и весьма внушительный по объёму (более 20 000 записей) набор эмоциональной детской речи EmoChildRu, открытых датасетов взрослой эмоциональной речи, превосходящих RUSLANA по объёму, до сегодняшнего дня так и не создано.

Стоит заметить, что на игрушечных эмоциональных датасетах, как RAVDESS, TESS, EMO-DB, IEMOCAP результаты улучшаются по несколько раз в год. Вы можете сами убедиться в этом, набрав в поисковой системе название соответствующего датасета и аббревиатуру SOTA (state-of-the-art, уровень развития, лучший результат по какому-либо критерию). Однако у этих улучшений иногда бывает проблема с воспроизводимостью, ввиду чего к результатам без публикации исходного кода следует относиться с осторожностью. Чтобы избежать возможных ошибок или неоднозначностей, многие исследователи предпочитают публиковать не только статьи, но и кодовую базу своих проектов. Крупнейшим каталогом таких публикаций является ресурс paperswithcode.com, позволяющий найти работы, устанавливающие SOTA для самых разных задач машинного обучения, в том числе и для задачи распознавания эмоций.

Сферы применения эмоционального ИИ


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

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

Эмоциональным может быть не только смысл и синтаксис фразы, эмоции могут быть у интонационной окраски произносимого. Были предложены модели, способные в режиме обучения без учителя выучивать для каждой фразы некоторые стилистические векторы. К числу таких моделей относятся такие модели, как Tacotron TP-GST (Глобальные стилевые токены, предсказанные на основе текста) и GMVAE-Tacotron (Вариационный автокодировщик на основе смеси гауссовских распределений). Используя векторы, выученные моделью для фраз обучающей выборки, в качестве библиотеки стилей, можно добиться неплохой управляемости стилистикой синтеза. (Мы уже рассказывали, как добивались человечности в звучании наших виртуальных ассистентов Салют при помощи связки Tacotron 2 и LPCNet.) При этом отдельная модель может быть использована для того, чтобы построить стилистический вектор фразы на основе семантической информации. То есть, проще говоря, обучить модель, которая будет, исходя из смысла фразы, выбирать для неё правильную интонацию.

Другой класс моделей для распознавания эмоций по выражению лица. Сферы применения таких моделей это системы видеонаблюдения, мониторинг в пунктах массового обслуживания или во время проведения собеседований (анализ эмоциональных проявлений может использоваться для прогноза дальнейших успехов сотрудника), для определения реакции аудитории во время массовых мероприятий. Как и в случае голоса, модели можно учить не только распознавать эмоциональную мимику и жестикуляцию, но и имитировать её. Таков, например, робот японского художника Хироси Исигуро.

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

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

Новые возможности для Python-разработчиков SmartApp Framework в open source

09.02.2021 10:17:03 | Автор: admin
Платформа SmartMarket позволяет разработчику с любым уровнем подготовки создавать мультимодальные приложения для виртуальных ассистентов Салют, даже без программирования. Конечно, если хочется сделать что-то красивое и сложное, без кода не обойтись. Чтобы облегчить жизнь разработчикам, мы делимся с ними нашими наработками в open source.На митапе разработчиков SmartMarket, прошедшем в декабре, мы рассказали о новом фреймворке.
Ниже вы найдете текстовую версию доклада и его видеозапись.


Друзья, привет! Меня зовут Кристина, я backend-разработчик SberDevices и тимлид сервиса управления диалогом, который используется для работы виртуальных ассистентов Салют. Расскажу вам сегодня о новом инструменте SmartMarket SmartApp Framework, который мы выложили в open source.

Итак, давайте посмотрим, что же это такое. Во-первых, это Python-фреймворк, который создан для того, чтобы вы могли разрабатывать backend для смартаповс поддержкой виртуальных ассистентов Салют. Мы активно используем этот фреймворк внутри Сбера, большое число наших собственных смартапов построено на нем. Это такие диалоговые приложения, как погода, текущее время, многие банковские навыки, это и диалоговая часть Canvas App, про который очень хорошо и подробно рассказал мой коллега Антон. Наш самый любимый и вкусный пример Canvas App это заказ попкорна, а также это app каталога.



C помощью фреймворка можно разрабатывать диалоговую часть Native App, как яркий пример это app видео. (О разных типах смартапов можно узнать здесь. Примеч. ред.)

Диалоговая механика


Давайте рассмотрим, что нам предоставляет фреймворк, на чем он основан. Одна из его основных особенностей в том, что диалоговая механика построена на механизме слотфиллинга. Что это такое? Приведу пример. Допустим, мы с вами хотим создать диалоговый навык P2P-перевода. Диалоговую часть можно схематично описать некоей формой, поля которой это те сущности, которые мы хотим узнать у пользователя. В частности, для случая P2P-перевода мы хотим у пользователя узнать его имя, сумму, которую он хочет перевести, и согласие на подтверждение операции.

Одно из основных свойств поля филлер. Филлер это сущность, извлекающая из запроса пользователя информацию, которую мы хотим узнать. Помимо этого у поля есть свойство question, которое позволяет задать вопрос пользователю.

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



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

Сам диалоговый сценарий мы можем описывать несколькими путями. Первый и самый простой декларативно с помощью нашего внутреннего языка DSL, который выглядит, как JSON. Здесь я привела пример того, как декларативно описать поле, которое извлекает имя пользователя и задает ему вопрос.



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

Предобработка текста


На практике механизм слот филлинга плохо работает без хорошей предобработки текста. Каждый запрос от пользователя перед тем, как попадает в ваш смартап, проходит этап предобработки, что позволяет внутри фреймворка извлекать такие именованные сущности, как: временной интервал, организация, локация, ФИО, валюта, сумма и многие другие.

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



Работать с сырым JSON неудобно, поэтому для разработчиков внутри SmartApp Framework реализовано представление результатов предобработки в виде объектов классов, позволяющих удобно обращаться к сущностям предобработки. Благодаря этому филлер, который извлекает из предобработанного текста фамилию, имя, отчество пользователя, можно описать одной строкой на DSL или парой строк кода.

Запуск и тестирование смартапа


Допустим, вы разработчик, не зарегистрированный в SmartMarket, вам не хочется подключаться к нашему виртуальному ассистенту, но, тем не менее, написать и запустить свой смартап вы можете. Внутри SmartApp Framework реализовано локальное тестирование. При этом вы будете видеть подробный лог того, что у вас происходит. Но есть одна особенность: смартап должен принимать на вход предобработанный текст. В фреймворке есть модуль предобработки текста. Это не полноценная платформенная предобработка, в ней присутствуюет морфология, леммы, но отсутствуют извлекаемые сущности. Тем не менее этого достаточнодля запуска прототипа.



Если вы зарегистрированы в SmartApp Studio, вы умеете регистрировать свой вебхук и хотите попробовать запустить фреймворк, вам нужно сделать три простых шага:


  • второй шаг создать смартап командой create_app. Вместе с проектом развернётся пример диалогового сценария для того, чтобы вам было проще начать разработку;

  • третий командой run_app вы запускаете смартап и уже можете тестировать. Из коробки вам будет доступен тестовый сценарий, который знакомится с пользователем и показывает базовые умения ассистента.




На этом у меня все. Будем рады вашим отзывам, пулреквестам и даже issues. SmartApp Framework доступен по ссылке.

***
Приглашаем 11 февраля на Второй онлайн-митап разработчиков SmartMarket.
В этот раз поговорим об устройстве хорошего мультимодального приложения для виртуальных ассистентов Салют, возможностях ASR и TTS, а также о монетизации смартапов на платформе SmartMarket.
Узнать подробнее, что вас ждет на митапе, и зарегистрироваться на него можно здесь.
Подробнее..

Бесшовные AB-обновления в Android как они устроены

29.09.2020 10:08:21 | Автор: admin
image

Всем привет.

В SberDevices наша команда занимается разработкой различных железок прошивок и для них на базе AOSP.

Начиная с Android 8 (у некоторых вендоров с 7.1) в системе появился новый механизм накатки OTA-обновлений, т. н. Seamless A/B OTA Updates бесшовные обновления. В этом посте я опишу общие принципы его работы, рассмотрю механизм с точки зрения разработчика, а также проведу сравнение со старым (будем его называть recovery-based) подходом применения обновлений. Всё нижесказанное будет справедливо только для чистого AOSP, т. к. конкретная реализация зависит от вендора.

Recovery-based OTA


Обновления для Android поставляются в виде zip-архива с образами обновляемых разделов (block-based updates). Во времена KitKat это был просто набор файлов, которые копировались на устройство прилагаемым скриптом. Я не стану подробно останавливаться на этом режиме, кратко опишу основные принципы его работы:

  • zip-архив скачивается системой на устройство;
  • система перезагружается в режим recovery;
  • проверяется совместимость обновления с устройством, его подпись;
  • если всё OK, выполняется updater-script из zip-архива;
  • в процессе обновления устройство может несколько раз перезагрузиться (например, для обновления device tree);
  • если всё прошло успешно, загружаемся в новую прошивку.

Какие минусы в данной схеме?

  • Необходимость резервировать достаточное количество встроенной памяти для OTA-архива. Для этого служит раздел /cache. Некоторые вендоры используют /data, но это редкость. В итоге пользователю остаётся меньше места (да, приложения всё ещё могут использовать место в разделе /cache, но с некоторыми ограничениями).
  • Перезагрузка и применение обновления занимает время, что может быть критично для некоторых видов устройств, например, для Smart TV.
  • Прерывание процесса обновления может привести к boot loop.
  • Нет возможности откатиться на старую версию прошивки.

Эти неудобства позволяет обойти способ бесшовного обновления. Давайте посмотрим, как он устроен.

Seamless A/B OTA


Ключевые компоненты и механизмы, необходимые для реализации бесшовных A/B-обновлений:

  • слотовая разметка флеш-памяти;
  • взаимодействие с загрузчиком, управлениесостоянием слотов;
  • системный демон update_engine;
  • генерация zip-архива с обновлением. В рамках данной статьи этот аспект рассматриваться не будет.

Слотирование


Основным принципом работы A/B OTA являетсяслотирование.Все разделы, которые необходимо обновлять (это могут быть любые разделы, а не только системные),должны находиться в двух копиях или, иначе, в слотах. В Android-реализации поддерживается 2 слота,которыеименуются соответственно A и B. Система загружается и работает изтекущего слота, второй используется только в момент обновления.К имени раздела добавляется суффикс с именем слота.

Ниже приведена таблица сравнения двух вариантов организации разделов на устройстве.
image

Все слотируемые разделыпомечаютсяопциеймонтированияslotselect, чтобы системамоглавыбратьправильный слот.В зависимости от того, где они описаны, это может быть fstab либо dts.

Изменения в таблице разделов


  • В /сache большенет необходимости.Теперьобновлениеможет сохраняться либов /data,либосразупрошиваться внеактивныйслот(обэтом ниже).
  • Раздел recovery также больше не используется.Однакорежимrecoveryвсё ещё существует, оннеобходим, например, для сброса устройства на заводские настройки (к этому может привестиrescueparty). Или для т. н. ручного обновления (sideload) через adb.Recovery ramdiskтеперьлежит внутриboot-раздела,ядро общее.
  • Для переключения режима загрузки (android/recovery) появилась новая опция в cmdline skip_initramfs.

На первый взгляд кажется, что такая схема не оптимальна, т. к. под систему необходимо выделить в два раза больше места. Но ведь мы избавились от/cache,а значит уже сэкономили большое количествопамяти. Таким образом,система будет заниматьнемногобольше, чем в варианте с recovery.

Главным достоинством A/B-обновлений является возможностьстриминга прошивки. Именно она обеспечивает бесшовность и прозрачность обновлений для пользователя: для обновления устройству достаточно перезагрузиться в новый слот. В этом режиме нет необходимости заранее скачивать zip-архив, занимая место в /data. Вместо этого система сразу пишет блоки данных из специально подготовленного файла (payload, см. ниже) в каждый разделнеактивногослота. С точки зрения реализации нет разницы, скачиваем ли мы предварительно обновление либо сразу стримим его в слот.

Слоты имеют следующие состояния:

  • active активный слот, из него будет загружена система при следующей перезагрузке;
  • bootable обновление успешно прошито в слот, прошло валидацию, совпали хеш-суммы и т. д.;
  • successful система смогла успешно загрузиться в новый слот;
  • unbootable слот поврежден. Система всегда помечает слот как unbootable перед началом процесса обновления.

Оба слота могут бытьbootableиsuccessful, но только один active.

Алгоритм работы загрузчика при выборе слота:
image
  • Загрузчик определяет, что имеется один или более слотов с флагомbootable.
  • Из них выбирается активный слот (либо слот с наибольшим приоритетом).
  • Если система загрузилась успешно, слот помечается какsuccessfulиactive.
  • Иначе слот помечается как unbootable и система перезагружается.


Изменение состояний слотов во время обновления:
image

Необходимые компоненты для работы с Seamless A/B.


boot_control


Для поддержки A/B-обновлений вендор должен реализовать специальный HAL-интерфейс boot_control. Он позволяет изменять состояния слотов и получать о них информацию. Для внешней работы (например, через adb shell) используется утилита bootctl. Интерфейс используется как средство взаимодействия между ОС и загрузчиком.

update_engine


Основной компонент всей A/B-схемы. Занимается загрузкой, стримингом обновлений, проверкой подписи и многим другим. Изменяет состояния слотов через boot_control. Позволяет контролировать процесс обновления устройства: приостанавливать, возобновлять, отменять.
Компонент пришёл в Android из ChromeOS, где уже используется некоторое время.AOSP поддерживает update_engine в виде статической sideload-сборки. Именно она используется в recovery, т.к данный режим не поддерживает динамическую линковку.

Процесс работы данного компонента можно разделить на следующие шаги:

  • загрузка обновления в слот. Загружать можно как из предварительно скачанного пакета с обновлением, так и напрямую по Сети через http/https. В процессе загрузки проверяется подпись, открытый ключ уже находится на устройстве (/system/etc/update_engine/update-payload-key.pub.pem);
  • верификация загруженного обновления и сравнение хеш-сумм;
  • выполнение post-install скриптов.

Структура пакета обновления:
2009-01-01 00:00:00 .....          360          360  META-INF/com/android/metadata2009-01-01 00:00:00 .....          107          107  care_map.txt2009-01-01 00:00:00 .....    384690699    384690699  payload.bin2009-01-01 00:00:00 .....          154          154  payload_properties.txt2009-01-01 00:00:00 .....         1675          943  META-INF/com/android/otacert

  • care_map.txt используется update_verifier-ом (см. ниже);
  • payload_properties.txt содержит хеши и размеры данных внутри payload;
  • payload.bin пакет обновления, содержит блоки всех разделов, метаданные, подпись.


update_engine_client


Клиент для управления демоном update_engine. Может напрямую вызываться вендором для применения обновления.

update_verifier


Утилита для проверки целостности системы при первом запуске (слот с флагомactive, но еще неsuccessful). Контроль целостности реализуется с помощью модуля ядра dm-verity. Если проверка закончилась успешно, утилита помечает текущий слот какsuccessful. Иначе система перезагружается в старый слот. Верифицируются только блоки, указанные в файле care_map.txt.

UpdateEngineApi


Для реализации vendor-сервисов обновлений существует Java API. Также имеется пример реализации такого сервиса.

Рассмотрим пример сборки A/B update в AOSP. Для этого отредактируем Makefile целевой платформы:
#Включим поддержку A/BAB_OTA_UPDATER := true#Укажем необходимые разделы для слотирования:AB_OTA_PARTITIONS := boot system vendor#Добавим необходимые пакетыPRODUCT_PACKAGES := update_engine update_engine_client update_verifier#Отключим раздел recoveryTARGET_NO_RECOVERY := true#Убедимся, что НЕ определяются переменные для раздела cache:#BOARD_CACHEIMAGE_PARTITION_SIZE := ...#BOARD_CACHEIMAGE_FILE_SYSTEM_TYPE := ...

После вызова make otapackage получаем zip-архив с обновлением. В таком виде он уже подходит для sideload-режима. Можем выполнить перезагрузку в recovery и вызвать adb sideload ota.zip. Этот способ удобен для отладки.

Применение обновления изнутри рабочей системы обычно определяется вендором. Самый простой способ выложить payload.bin на http-сервер и напрямую вызвать update_engine_client.

Пример вызова:
update_engine_client \--payload=http://path/to/payload.bin\--update \--headers=" \FILE_HASH=ozGgyQEddkI5Zax+Wbjo6I/PCR8PEZka9gGd0nWa+oY= \FILE_SIZE=282344983\METADATA_HASH=GLIKfE6KRwylWMHsNadG/Q8iy5f786WTatvMdBlpOPg= \METADATA_SIZE=26723"

В параметр headers передается содержимое файла payload_properties.txt. В logcat можно наблюдать прогресс обновления. Если передать ключ --follow, прогресс будет дублироваться в stdout.

Заключение


Плюсы нового механизма обновлений очевидны:
  • обновление системы происходит в фоне, не прерывая работу пользователя. Да, всё так же потребуется перезагрузка (в новый слот), но пройдёт оназначительнобыстрее, чем перезагрузка в recovery для применения обновления;
  • минимизируется вероятность boot loop (от ошибок в реализации никто не застрахован). Процесс обновления можно прерывать, наактивныйслот это никак не повлияет;
  • появляется возможность отката на предыдущую версию прошивки. Даже если по каким-то причинам обновление прошло неуспешно, система простовернётся к старой версии;
  • благодаря стримингу устройство обновится быстрее;
  • в зависимости от реализации можно полностью исключить пользователя из процесса обновления.

Из минусов я бы выделил два момента:
  • A/B OTA становится зависимой от текущей разметки диска, т. к. обновление происходит во время работы системы. Т. е. становится невозможно накатить обновление с изменёнными разделами;
  • относительная сложность реализации.

И все же, на мой взгляд, плюсы перевешивают. Кстати, в нашем недавно анонсированном устройстве мы используем A/B OTA обновления.
Подробнее..

1000 и 1 способ сесть на мель в Spring WebFlux при написании высоконагруженного сервиса

29.04.2021 10:23:13 | Автор: admin

Источник изображения: Shutterstock.com/photowind

Добрый день, меня зовут Тараканов Анатолий, я senior java разработчик SberDevices. 2.5 года программирую на Java, до этого 6 лет писал на C# и 1 год на Scala. Хочу поделиться опытом создания сервиса-оркестратора Voice Processing Service. Он является точкой входа для пользователей семейства виртуальных ассистентов Салют. Через него также проходит часть трафика приложений SmartMarket, где любой разработчик может написать навык для наших виртуальных ассистентов Салют. Одним словом, на сервис приходится немалая нагрузка. Давайте посмотрим, какие проблемы при его создании возникли и как мы их решали, а также сколько времени ушло на поиск причин. И всё это в контексте реактивного фреймворка Spring WebFlux.

Немного о сервисе


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

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


Как видно, смежных систем немало. API части из них доступны по REST-у запрос-ответ, другие по Socket-у потоковая передача данных.

Сервис хостится в нескольких ЦОДах, в том числе в SberCloud, горизонтально масштабируется в OpenShift. Для передачи, поиска и хранения логов используется ELK-стек, для трассировки Jaeger, для сбора метрик Prometheus, а для их отображения Grafana.



Каждый инстанс в секунду держит нагрузку примерно в 7000 пакетов (средний размер пакета 3000 байт). Это эквивалентно активности 400 пользователей, которые без перерыва обращаются к виртуальному ассистенту. С учётом взаимодействия нашего сервиса со смежными число пакетов увеличивается втрое до 21 000.
Каждая виртуалка имеет 3 ядра и 8 Gb оперативной памяти.

Сервис создавался в реалиях стартапа, а значит неопределенности. Были такие вводные:

  • поддержка TLS/mTLS;
  • WebSocket с клиентом;
  • текстовый, голосовой стриминг;
  • отказоустойчивость 99.99;
  • высокая нагрузка;
  • масса смежных систем в перспективе и необходимость в гибком формате контракта.

В этих реалиях мы выбрали такие технологии:

  • Java 11 с Gradle;
  • JSON/Protobuf на транспортном уровне.

Оба формата позволяют легко шерить контракт между командами, программирующими на разных языках. Для обоих форматов есть решения автогенерации DTO в нотации многих языков на базе исходной структуры. Оба позволяют без боли вносить изменения в контракт.

А ещё мы использовали Junit 5 и Mokito для тестирования и несколько библиотек Nimbus JOSE + JWT, Google Guava, Lombok, vavr.io для удобства в виде синтаксического сахара и автогенерации кода.

Оценив требования, мы решили втащить в наш технологический стек Spring WebFlux с Reactor и Netty под капотом.

Итак, поговорим о нюансах использования этого реактивного фреймворка.

Кастомизация Netty-сервера


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

Так вот, всё это можно сделать в компоненте, имплементирующем WebServerFactoryCustomizer. В его методе доступны как HttpServer, так и каждое клиентское подключение.



Пропущу этап создания сервиса и сразу перейду к его сдаче на стенд нагрузочного тестирования. В тот же день мы получили фидбэк о том, что с течением времени число незакрытых соединений растёт. Стали искать причину анализировали tcp-дампы с помощью WireShark. Выяснилось, что клиент не присылал сигнал о закрытии соединения, а также, что в реакторе по умолчанию не инициализируются обработчики таймаутов на входящие/исходящие пакеты. Для исправления ситуации в вышеуказанный компонент был добавлен такой обработчик.



На просмотр логов, анализ ситуации со смежниками, сбор дампов и их анализ, исправление и тестирование у нас ушло 2 дня. Немало.

Следующей проявившейся под нагрузкой проблемой было то, что спустя порядка 30 минут после начала теста смежные сервисы, доступные по RESTу, стали иногда отвечать на запросы ошибкой Сonnection reset by peer. Мы снова отправились смотреть логи, дампы. Оказалось, дело было в том, что при инициализации HttpClient-а фабричным методом .create(), размер пула соединений по умолчанию будет равен 16 или числу процессоров, умноженному на два. Со своей логикой выселения, ожидания свободного соединения и многим другим. И это всё на каждый тип протокола.



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

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



Поиск причины такого поведения съел 3 дня, это больно.

Мы развивали наш сервис дальше, накручивали логику, сценарии становились всё сложнее и вот, в один прекрасный день с нагрузочного тестирования пришла печальная весть: мы перестали держать ожидаемую нагрузку. Что обычно делают в таком случае берут в руку JFR и профилируют. Так мы и поступили. Результат не заставил себя долго ждать. Мы обнаружили, что при написании fluent-цепочек вызовов методов Flux-ов о декомпозиции логики в функциональном стиле стоит забыть.



В приведенном фрагменте кода замеряется работа флакса из 100_000 элементов с 1 реактивным методом, во втором с 6 методами. Тест проверяет, что первый метод работает вдвое быстрее второго, причем число итераций проверок не играет роли.

Почему так? Потому что на каждом этапе вызова методов .map/.filter/.flatmap/.switchOnFirst/.window и других создается Publisher, Subscriber и другие специфичные каждому из этих методов объекты. В момент подписки происходит вызов Publisher и Subscriber вверх по fluent-цепочке. Все эти накладные расходы можно наглядно увидеть в стектрейсах. Эту проблему решали 3 дня, такого рода рефакторинг недешёвое удовольствие.

Итак, мы отрефачили код, прошли тестирование. Ещё несколько месяцев обрастали новыми смежными сервисами и сценариями потоковой обработки. Как вы думаете, какие грабли пришли в движение следующими? Те, что находятся в ядре самого WebFlux-а. В логике сервиса было с десяток мест с методами .groupBy и .flatMap. В связи с особенностями контракта и бизнес-логики они порождали множество очередей, к тому же при некоторых стечениях обстоятельств группы не финализировались. Приклад не падал, но процессинг останавливался, а перед этим происходила утечка памяти.

Кстати, на гитхабе много вопросов по этой теме. Если отвечать коротко, то стоит заглядывать вглубь каждого метода. Там может быть много интересного: от ограничений по размеру внутренней очереди, volatile чтений/записей, до порождения потенциально бесконечного числа очередей, которые сами собой не зафиналятся. Подробнее здесь: github.com/reactor/reactor-core/issues/596.



Вот, собственно, простой тест с замиранием процессинга.



Как видно, последняя запись в логе 255 элемент. Если заглянуть в документацию, то причина такого поведения станет очевидна, но кто её читает?) Особенно когда методы имеют такие говорящие и всем привычные названия.

Были проблемы и с методом .windowWhile. Вот ссылка на найденный нами в этом методе баг. Отмена подписки на его источник данных останавливала работу оператора.

С фреймворком Spring WebFlux нужно быть очень аккуратным. В том числе нужно следить за тем, какой паблишер возвращается методом. На какие-то можно подписываться неограниченное число раз (FluxReplay), но они имеют нюанс с размером буфера, другие возвращают один и тот же элемент каждому новому подписчику (MonoDefer).

Несколько эффективных и дешёвых оптимизаций


  • Переход на Z Garbage Collector сильно улучшил производительность, а интервалы простоя приложения во время сборки мусора сократились с 200 мс до 20 мс.

  • С той же версией приложения и под той же нагрузкой G1 давал пилу с большими зубьями по таймингам, Major GC вообще шёл вразнос, так как не хватало CPU на I/O-операции. В то же время ZGC / Shenandoah GC сократили пилу раз в 10.

  • Если ваш сервис занимается передачей тяжеловесных данных (голоса или видео) стоит внимательно посмотреть на io.netty.buffer и пользоваться его возможностями. Профилирование показало, что его использование позволило вдвое уменьшить основную категорию мусора в памяти.

  • Использование метрик Reactor Netty вместе с профилированием показали, что на криптографию уходила уйма времени, поэтому мы перешли с JDK SSL на Open SSL. Это в 2 раза ускорило приклад.

Используйте JFR + JMC, именно они подсветили все эти проблемы. Во время ревью кода можно сделать неверные выводы, бенчмарк для отдельных маленьких операций можно некорректно написать и получить непоказательные результаты, но flame graph/monitor wait/thread park/GC-разделы в JMC подсветят реальные проблемы.

В качестве итогов


Reactor Netty удобен, гибок и быстр. Что касается текущей реализации Spring WebFlux, то она позволяет добиться высокой производительности, даже если сервис процессит большой объем событий в единицу времени в рамках каждого подключения и содержит витиеватую логику с нелинейной обработкой и ветвлениями.

Но придётся следовать трём правилам:

размеры очередей и буферов под капотом требуют тонкой настройки. Также нужно помнить, что использование фреймворка на каждом шагу порождает новый источник данных, который нужно закрывать;

следует избегать тяжеловесных .groupBy и .flatMap, лучше использовать .handle и .flatMapIterable, где возможно;



цепочки вызовов методов фреймворка должны быть короткими, а декомпозицией логики обработки лучше заниматься в своих методах, либо использовать Operators.lift и Sinks для создания своего реактивного оператора.



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


Источник изображения: Shutterstock.com/SEE D JAN

Отдельного рассказа заслуживают нюансы применения сборщиков мусора (GC), инструментов JFR/JMC, особенности работы с буферами и очередями в Spring WebFlux, а также тонкости настройки Netty-сервера.
Подробнее..

Сбер выложил русскоязычную модель GPT-3 Large с 760 миллионами параметров в открытый доступ

22.10.2020 10:15:06 | Автор: admin
Последнее десятилетие в области компьютерных технологий ознаменовалось началом новой весны искусственного интеллекта. Впрочем, ситуацию в индустрии в наши дни можно, наверное, охарактеризовать уже не как весну, а полноценное лето ИИ. Судите сами, за последние неполные 10 лет только в области обработки естественного языка (Natural language processing, NLP) произошли уже две настоящие технологические революции. Появившаяся в результате второй из них модель GPT-3 произвела настоящий фурор не только в технологических медиа, но стала знаменитой далеко за пределами научного сообщества. Например, GPT-3 написала для издания The Guardian эссе о том, почему ИИ не угрожает людям. GPT-3 сочиняет стихи и прозу, выполняет переводы, ведёт диалоги, даёт ответы на вопросы, хотя никогда специально не училась выполнять эти задачи. До недавних пор все возможности GPT-3 могли по достоинству оценить лишь англоязычные пользователи. Мы в Сбере решили исправить эту досадную оплошность. И сейчас расскажем вам, что из этого получилось.


Источник изображения

Две революции в обработке естественного языка


Первая революция в NLP была связана с успехами моделей, основанных на векторных представлениях семантики языка, получаемых при помощи методов обучения без учителя (Unsupervised learning). Расцвет этих моделей начался с публикации результатов Томаша Миколова (Tom Mikolov), аспиранта Йошуа Бенджио (Yoshua Bengio) (одного из отцов-основателей современного глубокого обучения, лауреата Премии Тьюринга), и появления популярного инструмента word2vec. Вторая же революция началась с развития механизмов внимания в рекуррентных нейронных сетях, вылившаяся в понимание того, что механизм внимания самодостаточен и вполне может быть использован и без самой рекуррентной сети. Появившаяся в результате нейросетевая модель получила название трансформер [transformer]. Она была представлена научному сообществу в 2017 году в статье с программным названием Внимание это всё, что вам нужно [Attention Is All You Need], написанной группой исследователей из Google Brain и Google Research. Быстрое развитие сетей, основанных на трансформерах, привело к появлению гигантских языковых моделей, подобных Generative Pre-trained Transformer 3 (GPT-3) от OpenAI, способных эффективно решать множество задач из области NLP.

Для обучения гигантских трансформерных моделей нужны значительные вычислительные ресурсы. У вас не получится просто взять современную видеокарту и обучить такую модель на своём домашнем компьютере. В оригинальной публикации OpenAI представлено 8 вариантов модели, и если взять самую маленькую из них (GPT-3 Small) со 125 миллионами параметров и попытаться обучить её при помощи профессиональной видеокарты NVidia V100, оснащённой мощными тензорными ядрами, то на это уйдёт примерно полгода. Если же взять самый большой вариант модели со 175 млрд параметров, то результата придётся дожидаться почти 500 лет. Стоимость обучения самого большого варианта модели по тарифам облачных сервисов, предоставляющих современные вычислительные устройства в аренду, переваливает за миллиард рублей (и это ещё при условии линейного масштабирования производительности с увеличением числа задействованных процессоров, что в принципе недостижимо).

Да здравствуют суперкомпьютеры!


Понятно, что подобные эксперименты доступны только компаниям, обладающим значительными вычислительными ресурсами. Именно для решения подобных задач в 2019 году Сбер ввёл в эксплуатацию суперкомпьютер Кристофари, занявший первое место по производительности в числе имеющихся в нашей стране суперкомпьютеров. 75 вычислительных узлов DGX-2 (в каждом по 16 карт NVidia V100), связанных сверхбыстрой шиной на базе технологии Infiniband, позволяют обучить GPT-3 Small всего за несколько часов. Однако и для такой машины задача обучения более крупных вариантов модели не является тривиальной. Во-первых, часть машины занята обучением других моделей, предназначенных для решения задач в области компьютерного зрения, распознавания и синтеза речи и множестве других областей, интересующих различные компании из экосистемы Сбера. Во-вторых, сам процесс обучения, использующий одновременно множество вычислительных узлов в ситуации, когда веса модели не помещаются в памяти одной карты, является весьма нестандартным.

В общем, мы оказались в ситуации, когда для наших целей не годился привычный многим torch.distributed. Вариантов у нас было не так уж и много, в итоге мы обратились к родной для NVidia реализации Megatron-LM и новому детищу Microsoft DeepSpeed, что потребовало создания на Кристофари кастомных докерных контейнеров, с чем нам оперативно помогли коллеги из SberCloud. DeepSpeed, в первую очередь, дал нам удобные инструменты для model parallel тренировки, то есть разнесения одной модели на несколько GPU и для шардирования оптимизатора между GPU. Это позволяет использовать более крупные батчи, а также без горы дополнительного кода обучать модели с более чем 1,5 миллиардами весов.

Удивительным образом технологии за последние полвека в своём развитии описали очередной виток спирали похоже, эпоха мейнфреймов (мощных компьютеров с терминальным доступом) возвращается. Мы уже привыкли, что основным инструментов разработки является персональный компьютер, выделенный в монопольное пользование разработчику. В конце 1960-х начале 1970-х годов час работы мейнфрейма стоил примерно столько же, сколько составляла заработная плата оператора ЭВМ за целый месяц! Казалось, что эти времена ушли навсегда и железо стало навсегда дешевле рабочего времени. Однако, похоже, железо совершило впечатляющий камбэк [comeback]. Будни современного специалиста в области машинного обучения вновь напоминают будни Саши Привалова из повести братьев Стругацких Понедельник начинается в субботу, с той лишь разницей, что место Алдана в нашем случае занимает Кристофари, а роль магии и чародейства выполняют методы глубокого обучения [deep learning].

Из опыта SberDevices


Нам много раз приходилось в прошлом учить другие модели на основе трансформеров это и различные наследники BERT'а, и модели кодировщик (энкодер) декодер [encoder decoder], подобные T5 от Google. Виртуальные ассистенты, созданные SberDevices для различных поверхностей, начиная новейшими SberBox и SberPortal и заканчивая привычным всем приложением Сбербанк Онлайн, используют в своей работе несколько подобных моделей для решения различных задач в ходе общения с пользователем. Например, виртуальный ассистент Джой использует в режиме болталки модель GPT-2 Medium, обученную на большом корпусе русской литературы, доученную на специальном диалоговом датасете и снабжённую особым механизмом ранжирования, предназначенным для выбора наиболее интересных ответов. Такие модели способны вести с пользователем беседу, не выбирая реплики из заранее заготовленной библиотеки ответов, а изготавливая свои фразы на лету, что делает общение с ними более разнообразным и занимательным.



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

Словом, наш опыт в обучении больших трансформерных моделей пришёлся как нельзя кстати, когда руководство Сбера приняло решение о выделении вычислительных ресурсов под исследовательский проект по обучению GPT-3. Такой проект потребовал объединения усилий сразу нескольких подразделений. Со стороны SberDevices лидерскую роль в этом процессе взяло на себя Управление экспериментальных систем машинного обучения (при этом в работе участвовал также ряд экспертов из других команд), а со стороны Sberbank.AI команда AGI NLP. В проект также активно включились наши коллеги из SberCloud, занимающиеся сопровождением Кристофари.

Совместно с коллегами из команды AGI NLP нам удалось собрать первую версию русскоязычного обучающего корпуса суммарным объёмом свыше 600 Гб. В него вошла огромная коллекция русской литературы, снапшоты русской и английской Википедии, коллекция снапшотов новостных и вопрос-ответных сайтов, публичные разделы Pikabu, полная коллекция материалов научно-популярного портала 22century.ru и банковского портала banki.ru, а также корпус Omnia Russica. Кроме того, поскольку мы хотели поэкспериментировать с возможностью обработки программного кода, мы включили в обучающий корпус снапшоты github и StackOverflow. Команда AGI NLP провела большую работу по чистке и дедупликации данных, а также по подготовке наборов для валидации и тестирования моделей. Если в оригинальном корпусе, использованном OpenAI, соотношение английского и других языков составляет 93:7, то в нашем случае соотношение русского и других языков составляет примерно 9:1.

В качестве основы для первых экспериментов мы выбрали архитектуры GPT-3 Medium (350 миллионов параметров) и GPT-3 Large (760 миллионов параметров). При этом мы обучали модели как с чередованием блоков трансформера с разреженным [sparse] и полным [dense] механизмами внимания, так и модели, в которых все блоки внимания были полными. Дело в том, что в оригинальной работе от OpenAI говорится о чередовании блоков, но не приводится их конкретная последовательность. Если все блоки внимания в модели будут полными, это увеличивает вычислительные затраты на обучение, но гарантирует, что предсказательный потенциал модели будет использован в полной мере. В настоящее время в научном сообществе ведётся активное изучение различных моделей внимания, предназначенных для снижения вычислительных затрат при обучении моделей и увеличения точности. За короткое время исследователями были предложены лонгформер [longformer], реформер [reformer], трансформер с адаптивным диапазоном внимания [adaptive attention span], сжимающий трансформер [compressive transformer], поблочный трансформер [blockwise transformer], BigBird, трансформер с линейной сложностью [linformer] и ряд других аналогичных моделей. Мы также занимаемся исследованиями в этой области, при этом модели, составленные из одних только dense-блоков, являются своеобразным бенчмарком, позволяющим оценить степень снижения точности различных ускоренных вариантов модели.

Конкурс AI 4 Humanities: ruGPT-3


В этом году в рамках AI Journey команда Sberbank.AI организовала конкурс AI 4 Humanities: ruGPT-3. В рамках общего зачета участникам предлагается представить прототипы решений для любой бизнес- или социальной задачи, созданных с помощью предобученной модели ruGPT-3. Участникам специальной номинации AIJ Junior предлагается на базе ruGPT-3 создать решение по генерации осмысленного эссе по четырем гуманитарным предметам (русский язык, история, литература, обществознание) уровня 11 класса (ЕГЭ) по заданной теме/тексту задания.

Специально для этих соревнований мы обучили три версии модели GPT-3: 1) GPT-3 Medium, 2) GPT-3 Large с чередованием sparse и dense-блоков трансформера, 3) наиболее мощную GPT-3 Large, составленную из одних только dense-блоков. Обучающие датасеты и токенизаторы у всех моделей идентичны использовался BBPE-токенизатор и наш кастомный датасет Large1 объёмом 600 Гб (его состав приведён в тексте выше).

Все три модели доступны для скачивания в репозитории соревнований.



Вот несколько забавных примеров работы третьей модели:







Как модели, подобные GPT-3, изменят наш мир?


Важно понимать, что модели типа GPT-1/2/3, на самом деле, решают ровно одну задачу они пытаются предсказать следующий токен (обычно слово или его часть) в последовательности по предшествующим. Такой подход позволяет использовать для обучения неразмеченные данные, то есть обойтись без привлечения учителя, а с другой стороны позволяет решать довольно широкий спектр задач из области NLP. Ведь в тексте диалога, например, реплика-ответ является продолжением истории общения, в художественном произведении текст каждого абзаца продолжает предшествующий текст, а в сессии вопросов и ответов текст ответа следует за текстом вопроса. Модели большой ёмкости в результате могут решать многие такие задачи без специального дообучения им достаточно тех примеров, которые укладываются в контекст модели, который у GPT-3 довольно внушительный целых 2048 токенов.

GPT-3 способна не только генерировать тексты (в том числе стихи, шутки и литературные пародии), но и исправлять грамматические ошибки, вести диалоги и даже (ВНЕЗАПНО!) писать более-менее осмысленный программный код. Множество интересных применений GPT-3 можно найти на сайте независимого исследователя Гверна Бренуэна (Gwern Branwen). Бренуэн, развивая идею, высказанную в шуточном твите Андрея Карпатого (Andrej Karpathy), задаётся интересным вопросом: не являемся ли мы свидетелями появления новой парадигмы программирования?

Вот текст исходного твита Карпатого:

Мне нравится идея Программного обеспечения 3.0. Программирование переходит от подготовки датасетов к подготовке запросов, позволяющих системе метаобучения понять суть задачи, которую она должна выполнить. ЛОЛ [Love the idea for Software 3.0. Programming moving from curating datasets to curating prompts to make the meta learner get the task it's supposed to be doing. LOL].

Развивая идею Карпатого, Бренуэн пишет:

Нейронная сеть GPT-3 настолько огромна с точки зрения мощности и набора [использованных для обучения] данных, что демонстрирует качественно иное поведение: вы не применяете её к фиксированному набору задач, представленных в обучающем датасете, что требует повторного обучения модели на дополнительных данных, если вы хотите решить новую задачу (именно так надо переучивать GPT-2); вместо этого вы взаимодействуете с моделью, выражая любую задачу в виде описаний, запросов и примеров на естественном языке, подстраивая текст затравки [prompt], подаваемой на вход модели, до тех пор, пока она не поймёт и не научится на мета-уровне решать новую задачу, основываясь на высокоуровневых абстракциях, которые она выучила во время предобучения. Это принципиально новый способ использования модели глубокого обучения, и его лучше рассматривать как новый вид программирования, где затравка теперь является программой, которая программирует GPT-3 для выполнения новых задач. Затравочное программирование похоже не столько на обычное программирование, сколько на попытку научить суперинтеллектуального кота освоить новый трюк: вы можете попросить его выполнить трюк, и иногда он выполняет его идеально, что делает ещё более неприятной ситуацию, когда в ответ на запрос он сворачивается, чтобы вылизать свою задницу, при этом вы будете понимать, что проблема не в том, что он не может, а в том, что он не хочет.

Поскольку наша модель в процессе обучения видела github и StackOverflow, она вполне способна писать код (иногда не лишённый весьма глубокого смысла):


Что дальше


В этом году мы продолжим работы над гигантскими трансформерными моделями. Дальнейшие планы связаны с дальнейшим расширением и очисткой датасетов (в них, в частности, войдут снапшоты сервиса препринтов научных публикаций arxiv.org и библиотеки научных исследований PubMed Central, специализированные диалоговые датасеты и датасеты по символьной логике), увеличением размера обучаемых моделей, а также использованием улучшенного токенизатора.

Мы надеемся, что публикация обученных моделей подстегнёт работу российских исследователей и разработчиков, нуждающихся в сверхмощных языковых моделях, ведь на базе ruGPT-3 можно создавать собственные оригинальные продукты, решать различные научные и деловые задачи. Пробуйте использовать наши модели, экспериментировать с ними и обязательно делитесь со всеми полученными результатами. Научный прогресс делает наш мир совершеннее и интереснее, давайте улучшать мир вместе!
Подробнее..

Тестируем ruGPT-3 на новых задачах

20.11.2020 14:23:38 | Автор: admin

Рекомендательные системы с нуля, чат-боты и многое другое


Погрузившись в пучину текстовых данных, в октябре этого года мы обучили модели ruGPT-3 модели для русского языка на основе архитектуры от OpenAI. Но на что же способны эти модели? В этой статье мы соберем первые примеры применения модели и попробуем новые.

Мы представляем первые результаты самой большой из обученных моделей ruGPT-3 Large, разработанной совместно с командами SberDevices, Sber.AI и SberCloud. Изучим границы ее применения вместе с вами.

image

В этом году на AI Journey мы подготовили соревнование применений ruGPT-3 в трек можно сдать любое решение с использованием модели, оцениваемое по трем шкалам инновационность, эмоциональное вовлечение и бизнес-применимость.
Спойлер:
1 млн рублей за первое место



Как дообучить модель на новой задаче?


Модели и код к ним находятся в репозитории sberbank-ai: можно использовать библиотку transformers или Megatron-LM.

В этой статье я привожу примеры с использованием huggingface/transformers код для кейсов приведены здесь:

Карточки моделей в библиотеке transformers: Large Medium Small

При запуске скрипта генерации проще сделать Run all и затем немного подождать, пока модель загрузится.
image
Скрипт в последней ячейке попросит ввести начало текста моя любимая затравка: Бразильские ученые открыли редкий вид карликовых единорогов, обитающих на западе Ютландии. Получаем:
ruGPT-3 Small: Бразильские ученые открыли редкий вид карликовых единорогов, обитающих на западе Ютландии. Об этом сообщает Agence France-Presse. Единорог, получивший название Pygmaliona (лат. Pygmaliona pygmalioni), был обнаружен исследователями в ходе работ в области биологии. Его длина составляет менее 30 сантиметров, а масса около 1 килограмма. Животное относится к семейству единороговых. В его рационе преобладают растения, в том числе и карликовые деревья.


В Colab-ноутбук помещается только ruGPT-3 Small, поэтому лучше используйте карточки с памятью больше 14Gb.

Кстати, на время соревнования мы даем участникам дорожки доступ к мощностям Christofari!
Для участников трека ruGPT-3 мы выделили 100 аккаунтов в каждом аккаунте 1 GPU Tesla V100-SXM3 32 Gb бесплатно на время соревнования.
Как получить аккаунт?
1) Зарегистрируйтесь на трек ruGPT-3 (AI 4 Humanities) ods.ai/tracks/aij2020
2) Напишите короткое письмо с названием вашей команды и задачей на AIJ_ruGPT-3@sberbank.ru

image

Few-Shot vs Fine Tuning


В случае с такими большими генеративными моделями, как GPT-like архитектуры, есть несколько способов управиться с ними.
  • Первый способ: назовем его традиционный дообучить модель на доступном количестве примеров выполнять конкретное задание. В таком случае генеративная модель выучит формат ввода и вывода (GPT-3 очень редко ошибается в формате), и будет генерировать данные согласно вашей задаче. Это может быть разметка данных (в формате исходный текст текст в разметке) или просто генерация по заданному началу.
  • Второй способ: новый, называемый обычно затравочное программирование (англ. prompt engineering с легкой руки [Гверна Бренуэна] (http://personeltest.ru/aways/www.gwern.net/GPT-3#prompts-as-programming) мы даже ничего не дообучаем, а сразу пытаемся получить из модели то, что хотим.

Как работает затравочное программирование?


Дообучать большие модели бывает очень дорого, поэтому такой способ общения с ними позволяет избежать даже этого. Суть затравочного программирования в том, чтобы подобрать такие заготовленные примеры и начала для генерации, чтобы дальше модель выдавала ровно то, что надо.
Подбирая затравки и гиперпараметры генератора (температура, top_n, top_k), можно добиться вполне сносных ответов за счет только предварительного обучения модели.
image
Пример затравки с 1 примером и описание задачи.

Протестируем оба способа на практике попробуем решить популярные задачи с нуля, а специфичные решить с дообучением.

Рекомендательные системы


Сделаем рекомендательную систему без обучения: будем подавать ruGPT-3 Large информацию о предпочтениях пользователя в виде текста, и будем смотреть, как модель продолжит его. Можем сгенерировать сразу много вариантов, чтобы получить побольше рекомендаций.

Рекомендации фильмов:
Затравка: Мои любимые фильмы Матрица, Олдбой,
ruGPT-3 Large: Мои любимые фильмы Матрица, Олдбой, Крёстный отец, Игра в имитацию, Остин Пауэрс.
ruGPT-3 Large: Мои любимые фильмы Матрица, Олдбой, Спасение рядового Райана, Нечто, Затура (последняя, кстати, стоит того, чтобы ее посмотреть).
ruGPT-3 Large: Мои любимые фильмы Матрица, Олдбой, Эквилибриум и др.


Затравка: Я люблю советские комедии: Приключения Шурика,
ruGPT-3 Large: Я люблю советские комедии: Приключения Шурика, Собака на сене и Веселые ребята.
ruGPT-3 Large: Я люблю советские комедии: Приключения Шурика, Любовь и голуби.
ruGPT-3 Large: Я люблю советские комедии: Приключения Шурика, Три плюс два, Служебный роман и другие.


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

Рекомендации музыки:
Затравка: Тем людям, кому нравится Гражданская оборона, также понравятся группы #(как обычно, специально оставляем незакрытую кавычку)
ruGPT-3 Large: Тем людям, кому нравится Гражданская оборона, также понравятся группы Ленинград и Пикник.
ruGPT-3 Large: Тем людям, кому нравится Гражданская оборона, также понравятся группы ДДТ и Король и Шут.
ruGPT-3 Large: Тем людям, кому нравится Гражданская оборона, также понравятся группы Алиса, Доктор Пеппер, Машина времени, ДДТ и Крематорий.

Результаты получаются все время разные потенциально можно нагенерировать N вариантов, извлечь все названия групп и собрать Counter самых популярных вуаля рекомендательная система с нуля.

Генерация отзывов



Возьмем более сложную задачу заставим модель мимикрировать под человека в обсуждениях или магазинах:
Затравка: Напиши комментарий под видео.
Опять какой-то челлендж
ruGPT-3 Large: Напиши комментарий под видео.
Опять какой-то челлендж решили провести. Это даже не флешмоб, это уже идиотизм.


Затравка: Напиши отзыв о стиральной машине.
Данная модель стиральной машины
ruGPT-3 Large: Напиши отзыв о стиральной машине.
Данная модель стиральной машины оснащена встроенной функцией самоочистки.
В конструктивном решении стиральной машины предусмотрено устройство автоматического затирания воды, которая способна удалять накипь и прочие загрязнения даже в труднодоступных местах.
Стоит отметить, что после процедуры чистки, во время отжима появляется специфический запах. У некоторых моделей, в результате эксплуатации, он сохраняется в течение всего срока службы стиральной машины.


Завтравка: Напиши отзыв о фильме.
Фильм "1+1"
ruGPT-3 Large: Напиши отзыв о фильме.
Фильм "1+1" очень нравится, хотя и смотреть его стоит не каждому. Актёрский состав в нём великолепен. Смотрится без особого напряжения и с интересом. В фильме очень много смешных моментов. Так же советую посмотреть фильм "Зелёная книга", также фильм с Дженнифер Лопес и Крисом де Бургом.


Как видим, для тематик, широко распространенных в интернете, модель может генерировать связные тексты и без обучения. Но где же без дообучения все же никак?
Таких случая можно выделить 3:
сложный формат данных если при генерации без обучения вы теряете качество за счет генерации в неправильном формате задача NER, генерация кода, символьные вычисления и т.д.;
явная необходимость отвечать согласно заданному набору знаний, правил вы делаете QA по документации вашей компании, по учебникам, вики, без примеси социальных сетей и личного мнения;
ваша задача, скорее всего, не представлена в текстах рунета достаточно, чтобы модель могла хорошо генерировать в ее рамках например, генерация изображений по текстам.

StackOverflow


Поднимем планку сложности: скачаем русский [stack overflow](http://personeltest.ru/aways/ru.stackoverflow.com/) и попробуем сделать вопросно-ответную систему. Сможем ли мы сразу выучить и стиль ответов, и знания, и несколько языков программирования? Сразу получить хороший результат в таокй задаче нелегко, но мы можем развлечься за 5 эпох модель научилась воспроизводить стилистику, сильно путаясь в содержании. Зато хорошо выучила ссылки на документацию вполне неплохой итог для 5 эпох обучения.

Формат обучения: подаем тексты вопросов и лучших ответов в формате Q:blabla A:blabla.

Q: Как мне вывести список в обратном порядке в python? Я новичок
A: Простейший способ получить необходимый список: push.log("Shalom").
Установка значения означает угрозу попыткой нажатий на какую-нибудь цифру справа, поэтому я действую наоборот. Изменение размера и числа означает перегрузку времени активации
set.log()**)
rGet = puts.random(extents) log.findIndex(puts.current) void join($window, command='unsetMainServer onManager') }
Нет ничего хуже, чем полный дебаггинг


Q: Как мне вывести список в обратном порядке в python? Я новичок
A: import pycode as pyc;
// в этой статье я рассказал о месте показа списка в моей программе (подробно в статье href=https://docs.python.org/3/library/pycode.html )

(такой библиотеки на самом деле нет, модель сгенерировала ссылку на документацию)

Для таких задач можно вводить дополнительные аргументы например, название раздела/тематики/языка программирования, про который нужно ответить, и обучать модель на данных вида {параметр: значение, вопрос: текст_вопроса, ответ: текст_ответа}.

По части и кода, и текста сразу у нас пока фейл может, кто-то сделает лучше в рамках трека? На англоязычной модели с кодом уже есть вполне удачные реализации: написание html-кода элементов веб-страниц, генерация шаблонов Figma.

Пробуем другие языки! Twitter и не только


Основной язык обучения модели русский, но можно ли применять модель в мультиязычных задачах? Чуть-чуть других языков всегда попадает в обучающую выборку из веба, поэтому надежда есть. Прямолинейный подход с затравками показывает, что про английский модель немного знает:
ruGPT-3 Large:
кошка > cat
собака > dog
груша > pear
программист > coder

Ну, почти:
кошка > cat
собака > dog
груша > pear
питонист > Python

Иногда и совсем не получается:
кошка > cat
собака > dog
груша > pear
яблоко > bunch # пошел продолжать дальше
Кошка > dog
Хомяк > cat
Зверёк > dog

image

Почему бы не потренироваться на чисто англоязычных данных: я взяла датасет twitter-text-classification из Kaggle-соревнования.

После 5 эпох на 5 тысячах первых комментариев (20 минут в Colab) получаем вполне сносную генерацию очень даже токсичных комментариев на английском:

Context >>> Is it
ruGPT-3 Small: Is it's the case that #Microsoft is using #SAP to manage #Microsofts business?

Context >>> It is
ruGPT-3 Small: It is the only one that I've been trying to do. Siri is on the verge of death, and I'm not aware of why she has to be on the verge.

Context >>> Why
ruGPT-3 Small: Why do I go here? I'm wondering if I can use the #Microsoft Windows 8 Pro for the #WindowsPhone phone? Thanks!

Диалоговые системы


Уже сейчас, без предобучения, довольно хорошо работает применения модели к диалоговым системам: модель может выполнять функцию chit-chat (разговор ни о чем), свободно болтая на различные темы. С дообучением на конкретных сценариях и доменах можно реализовать и бизнес-приложения.
Пример ниже пример диалога без обучения, на узконаправленную тему саппорт интернет-провайдера.
Затравка: первые 2 строчки дальше генерация.
User1: Привет, я Маша! Чем могу помочь?
User2: У меня не работает интернет.
User1: Какой у вас тариф?
User2: У меня тариф 500мбит
User1: Что случилось?
User2: Проблемы с интернетом. Т.е. с телефоном. Я сейчас отключу сеть и подключу телефон
User1: Почему Вы звоните сейчас?
User2: Потому что я зашел на оф. сайт, а там скорость какая-то маленькая...
User1: Вы говорите, что скорость маленькая, но, может быть, она и должна быть маленькой?
User2: Но я до этой скорости не дотерпел
User1: Извините, мы тут не при чем. Мы позвонили в службу поддержки и сказали, что Вы звоните на этот номер.
User2: Мы звонили, но никто не отвечал. Я попробовал еще раз.
User1: У меня не получается подключиться к интернету. У меня кабель, значит, пропадает.
User2: Прошу Вас, скажите, что у вас происходит?
User1: Почему такая скорость?
User2: Мы приносим свои извинения. Но Вы в любом случае должны внести плату за интернет и все подключить.
User1: Все оплатить?
User2: Да
User1: У меня нет сейчас такой возможности. Я предлагаю Вам прийти на нашу бесплатную горячую линию и проверить оборудование.
User1: Извините, но я сейчас не могу. Надо кое-что оплатить.
User2: Пожалуйста, я свяжусь с вами в течение дня.
User1: Да
User2: Спасибо

Конечно, без предобучения у модели нет явного представления о сценариях и скриптах специалистов поддержки, однако, даже такой холодный старт уже показывает стандартный путь выяснить, что произошло отболтаться перенаправить звонок. Можно вспомнить классику:
User1: Техническая поддержка Стрима, инженер 656, Дмитрий, здравствуйте.
User2: Договор оформлен на Уральского, телефон 7661669, у меня к вам следующий вопрос: а вот скажите мне пожалуйста, что, когда теперь заканчивается сессия, что, теперь, это теперь будут разрывы при моём тарифе, да?
User1: Данная тарификация установлена с 1 сентября. Как только будут разрывы в телефонной связи, оператор будет сразу обращаться к вашему оператору, чтобы узнать с вами ли вы.
User2: Я так понимаю, что, да, то есть я что-то потерял в связи с этим?
User1: Да, поскольку с 1 сентября меняется тарифная сетка. То есть, до этого были какие-то перебои с доступом в интернет, на некоторых серверах было около месяца, что это было связано с перебоями в телекоме, вот это всё. Но не более того.
User2: Я специально проверял, там было просто кратковременные задержки, были, я бы сказал, какие-то незначительные.
User1: Да.
User2: То есть, ничего не потеряли?
User1: Ну как, надо немножко потерпеть, потерпеть.
User2: Спасибо, Дмитрий, до встречи.

В общем, надо потерпеть. Модель даже запомнила, что User1 зовут Дмитрий, и User2 соответствующе с ним попрощался.

Вместо заключения


Чтобы продолжать развивать направление генеративных моделей и улучшать архитектуры в задачах NLP, всегда необходимо понимать границы применимости той или иной технологии и ее востребованность.

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

Помимо вышеупомянутых кейсов, ruGPT-3 точно может применяться и приносить пользу в таких практиках, как:
  • аугментация текстовых данных для задач ML
  • диалоговые модели для автоматизации
  • задачи генеративной суммаризации
  • рерайтинг, генерация новостей, спортивных заметок по структурированной информации.


Надеемся, что демо и модели принесут сообществу пользу и фан!

И, конечно, ждем ваших решений на треке ruGPT-3 до конца 22 ноября!
Подробнее..

Как мы анализируем предпочтения пользователей виртуальных ассистентов Салют

18.03.2021 10:09:11 | Автор: admin
Приветствую всех! Меня зовут Ибрагим, я работаю в SberDevices и занимаюсь машинным обучением. Сегодня я расскажу о том, как мы находим и анализируем интересы и предпочтения пользователей наших виртуальных ассистентов Салют.

Также поделюсь видео с моего недавнего выступления на онлайн-конференции Применение ML в Digital-продуктах, которую проводили коллеги из AGIMA и Epoch8.


В этом посте мы разберём следующее:

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

Вступление


Работая над виртуальными ассистентами, нам часто необходимо обучать специфические модели-классификаторы, которые решают свою узкую задачу. У таких задач есть несколько особенностей:

отсутствие готовых датасетов;
отсутствие чёткой структуры классов, на которые можно разделить данные;
наличие сырых логов, в которых могут быть интересующие нас данные;
сильный дисбаланс классов, где самый многочисленный класс это класс нерелевантной информации.

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

Как мы используем BERT для задач NLU


Для начала поговорим немного об обработке естественного языка в контексте задач его понимания (natural-language understanding).

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

Для перевода слов и предложений в векторы используются разные подходы, но наиболее успешные нейронные сети на базе архитектуры трансформеров. По доброй традиции языковые модели на базе трансформеров называют иногда как маппетов, персонажей Улицы Сезам.
В свое время мы взяли модель от Google под названием BERT, обучили ее для русского языка и доработали под свои собственные задачи.



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



Такая архитектура позволяет достаточно быстро решать необходимую задачу, гибко настраивать разные аннотаторы, обучать новые. Следует отметить, что из BERT можно получать векторы не только для предложений, но и для токенов (слова или части слов). Такие векторы можно использовать, например, для распознавания именованных сущностей.

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

Находим первичные данные для нашей задачи


Переходим непосредственно к нашей задаче. Определение интересов и предпочтений пользователей на базе диалогов с виртуальным ассистентом это стандартная задача мультиклассовой классификации, когда для каждой реплики необходимо проставить один из классов. В диалоговом домене часто подобные задачи несут в себе определенные подводные камни. Например, большинство значащих, полезных классов в совокупности могут составлять лишь малую часть всего датасета (к примеру, не больше 1%). При этом 99% всех логов общения будут отнесены к классу, который можно назвать Другое или Нейтральное это всё, что не относится к вашей задаче. Поэтому подход, когда мы просто берем кусок датасета и отправляем его на разметку, может быть не самым рациональным. Имеет смысл сначала обучить модель, которая нам поможет достать часть датасета, несущую полезную для решения нашей задачи информацию. Потом проанализировать эту часть, понять, какие там есть классы, распределение между ними, сформулировать задание по разметке и сформировать конечный датасет для обучения необходимой нам модели.

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



Или же можно поискать дополнительные полезные источники информации. Этим способом воспользовались и мы. Помните, в детстве в журналах были такие разделы, где люди искали себе друзей по переписке? Они писали: Хей, меня зовут Ибрагим, я слушаю Blink-182, катаюсь на скейте. Давайте меняться напульсниками!. Мы нашли датасет подобных анкеточных писем, где не было личных данных или индексов, но предложения, реплики, где люди рассказывали о своих интересах, там присутствовали. Таким образом мы получили первую пару сотен реплик о том, где люди рассказывают что-то о себе, о каких-то своих предпочтениях.

Обогащаем датасет с помощью парафраз


Отлично, у нас есть первичный датасет. Теперь нам нужно его как-то обогатить.

Когда у вас, с одной стороны, есть размеченный, но маленький датасет, а, с другой неразмеченный, но очень большой, можно применить следующий способ:

  • взять небольшой размеченный датасет и для каждой фразы в нем найти синонимы из большого, но неразмеченного датасета;
  • проставить найденным синонимам тот же класс, что и у фраз из размеченного датасета.


Векторы, в которые мы кодируем наше предложение, по своей сути являются точками в признаковом пространстве. Что это значит? Это значит, что предложения, схожие по смыслу или по какому-то другому признаку, скорее всего, будут располагаться рядом. Например, предложения Мне нравится группа Metallica. и Я обожаю слушать тяжелую музыку. будут располагаться где-то рядом друг с другом. Это значит, что мы можем попробовать найти похожие по смыслу или синонимичные предложения к размеченным примерам, которые у нас уже есть. Такие предложения называют парафразами. Можно для каждого исходного предложения, для которого нам известен его класс, провести быстрый поиск ближайших соседей. Для этого можно воспользоваться библиотеками FAISS от Facebook, ScaNN от Google или другими и найти парафразы с определенным порогом по расстоянию. Таким образом можно обогатить изначальный датасет. И, условно, если у нас была пара сотен реплик, теперь мы можем получить пару тысяч реплик или предложений, где люди что-то рассказывали о своих интересах и предпочтениях.

Получаем полезную часть большого датасета


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



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

Кластеризуем данные, чтобы определить возможные будущие классы


Предложения, которые представлены точками в признаковом пространстве, могут образовывать группы, объединенные конкретным признаком. К примеру, группой может являться набор предложений, где люди рассказывают о любимой музыке, о любимых сериалах или книге. Поэтому можно взять все предложения, векторизовать их с помощью BERT, понизить размерность с помощью UMAP (потому что исходная размерность векторов BERT это 1024, если мы говорим про large модель). И затем кластеризовать полученные векторы с пониженной размерностью алгоритмом HDBSCAN. Таким образом можно получить группы и просмотреть глазами случайные предложения в них, чтобы понять, о чем люди рассказывают в диалогах. Теперь можно подумать, какие могут быть классы, подходящие под нашу задачу, и какое между этими классами распределение.



А еще во время этого этапа можно сразу сформировать список конкретных примеров с проставленными классами, которые в будущем можно использовать как honeypot примеры, по которым мы можем оценивать работу наших разметчиков, улучшая её.

Немного о разметке данных


Полученный нами датасет со сформированным заданием можно отправить на разметку.

Разметка данных это отдельный, очень большой и ответственный этап в обучении любой модели. Нужно понимать, что чем более корректно и понятно сформулировано ваше задание, чем больше оно соответствует той задаче, которую вы хотите решить, тем лучше будет качество этой разметки.

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

Что же можно сделать в таком случае? Самое простое попробовать переразметить датасет на фолдах. Часто исследователи данных для того, чтобы оценить метрики конкретной модели на конкретном датасете, проводят тестирование на k-fold. Делят датасет на k одинаковых частей, обучаются на части из них и делают предсказание на одной. Повторяют эту процедуру k раз, усредняют показатели метрик и получают некую средневзвешенную оценку метрики.

Во время каждого этапа тестирования можно не просто считать результат, а еще и сохранять предсказания модели. В итоге вы получите свой же датасет, но переразмеченный моделью.

Предложения, в которых модель была уверена, но при этом ее предсказания не совпадают с проставленной разметчиком меткой, можно отправить на доразметку. Условно, дать задание: Выберите один из двух классов: либо представленный моделью, либо разметчиком. Переразметив всего 5% исходного датасета, можно здорово повысить его чистоту, а значит и качество работы будущей модели. Либо, если вы уверены в результатах работы модели, вы можете с ее помощью проставить автоматические теги.

Недавно Google анонсировал алгоритм TracIn. Он оценивает то, какой вклад вносит каждый конкретный семпл в обучающей выборке в предсказание каждого конкретного семпла в тестовой выборке. Таким образом можно оценить, как влияет каждый семпл на точность работы модели на своём классе. Получается, если пример с высокой степенью ухудшает точность на собственном классе, то, возможно, это либо пример с неправильной разметкой, либо это достаточно редкий пример для самого класса. И в том, и в другом случае можно доразметить пример.

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

Внедрение модели и оценка метрик


Теперь нужно внедрять саму модель. Здесь мы активно используем практики MLOps. Во-первых, мы активно версионируем все наши модели не только с датасетом и кодом, но и между собой. Для этого мы используем DVC, потому что особенно важно, когда у вас двухступенчатая архитектура, версионировать модели между собой, чтобы была консистентность и между большой моделью-векторизатором (в нашем случае BERT), и между маленькими нейронными сетями, которые решают свои собственные задачи.

Пайплайны обучения мы стараемся обернуть в Jenkins jobs, чтобы можно было запускать их по одной кнопке. И делаем это мы не только для того, чтобы автоматизировать, но и для того, чтобы уменьшить процент ошибки, человеческого фактора. Чем меньше вам нужно самому что-то делать, тем меньше шанс, что на одном из этапов вы ошибётесь.

Метрики модели оцениваются как в офлайне на каких-то корзинах, так и в онлайне, если ваши модели влияют на определенные показатели бизнеса в контексте диалоговых агентов. А это, к примеру, длительность одной сессии, вовлеченность пользователя, лайки и дизлайки, добился ли пользователь своей цели и другие. Это всё необходимо мерить и оценивать.

Итоги


Подведем итоги. Для того, чтобы определить интересы и предпочтения пользователей на базе их диалогов с виртуальным ассистентом, необходимо:

собрать первичный датасет с корректной разметкой;

обогатить его с помощью поиска ближайших соседей;

построить первую модель простой бинарной классификации (поможет нам вычленить максимально полезный участок датасета);

кластеризовать данные и оценить полученные классы и распределения;

обучить конечную модель (завернув всё в пайплайны, версионировав);

оценить результаты по метрикам.



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

***
Оставлю здесь ссылки по теме:

пост про то, как мы обучали BERT и как сделали его устойчивым для парафраз;
лекция моего коллеги для Sberloga о том, какие трюки мы использовали, чтобы сделать нашу модель лучше;
одна из итераций модели Bert-large для русского языка, которую мы используем, выложена в open source и доступна любому;
рассказ о том, как мы с коллегами из Сбера обучили и выложили в открытый доступ русскоязычную модель GPT-3.
Подробнее..

Синтез речи виртуальных ассистентов Салют как мы отошли от классических научных статей, чтобы сделать его человеческим

25.03.2021 10:19:47 | Автор: admin
Автор исходного изображения: Blue Flourishes/Shutterstock.comАвтор исходного изображения: Blue Flourishes/Shutterstock.com

Всем привет! В этом посте мы расскажем про синтез голосов Сбера, Афины и Джой виртуальных ассистентов семейства Салют. О том, как мы в SberDevices обучали модели, чтобы сделать синтез живым и специфичным для каждого персонажа, а также с какими проблемами столкнулись и как их решали.

Согласно нашей библии ассистентов, Сбер энергичный гик, Афина взрослая и деловая, а Джой дружелюбная и веселая. Они отличаются не только уникальными характерами, обращением на ты/вы и предпочтениями в шутках. Мы попытались сделать так, чтобы их личности отражались и в голосах, которыми они разговаривают.

Персонажей озвучили телеведущая Анастасия Чернобровина (Афина) и актёры дубляжа Даниил Щебланов и Татьяна Ермилова (Сбер и Джой). Виртуальных ассистентов можно услышать в приложениях Сбер Салют, СберБанк Онлайн, нашем колл-центре по номеру 900, а также в устройствах SberBox и SberPortal. Всё, что вы услышите, это синтез речи, реализованный с помощью нейросетей. Он работает на связке Tacotron 2 и LPCNet.

Но, чтобы было понятно, что, зачем и почему, немного теории и истории.

1. Теория

Автор изображения: ioat/Shutterstock.comАвтор изображения: ioat/Shutterstock.com

Звук это волна, распространяющаяся в упругой среде воздухе. Человеческое ухо воспринимает её примерно так: волна, прошедшая через ушную раковину, колеблет барабанную перепонку среднего уха, с которой связаны органы молоточек и наковальня. Они передают колебания во внутреннее ухо с улиточкой и нервами.

1 височная кость; 2 слуховой канал; 3 ушная раковина; 4 барабанная перепонка; 6 молоточек; 7 наковальня; 8 стремечко; 5 овальное окно; 9 полукружные каналы; 10 улитка; 11 нервы; 12 евстахиева труба.1 височная кость; 2 слуховой канал; 3 ушная раковина; 4 барабанная перепонка; 6 молоточек; 7 наковальня; 8 стремечко; 5 овальное окно; 9 полукружные каналы; 10 улитка; 11 нервы; 12 евстахиева труба.

Источник изображения.

Похожим образом работают цифровые устройства для записи звука: обычно в микрофонах есть мембрана, которая колеблется от звуковых волн. Отклонения мембраны от первоначального положения записываются микрофоном несколько тысяч раз в секунду (обычно от 8000 до 48000, чаще всего 24000). Получается дискретизованный аудиосигнал, так называемое time domain-представление звука. Синтезировать звук в таком виде значит авторегрессионно, шаг за шагом, предсказывать 24 тысячи чисел в секунду. Единственный успешный (и революционный) проект, работающий в time domain, WaveNet от DeepMind, но добиться realtime-синтеза в нём можно только ухищрениями в ущерб качеству.

В задачах speech processing лучше пользоваться time-frequency-представлением звука с помощью спектрограмм (short time Fourier transform, STFT). Математически это временная последовательность модулей преобразования Фурье от коротких (10-20 мс) отрезков звука, внутри которых сигнал можно считать стационарным, то есть его спектральные характеристики почти не меняются за это время. Причины того, почему такой подход работает, тоже можно найти в биологии речевого тракта.

Речевой тракт человекаРечевой тракт человека

Источник изображения.

Человек разговаривает с помощью голосовых связок и других органов речи. Воздух выдыхается из легких, колеблет мембраны голосовых связок, получается периодический сигнал. Затем он резонирует, проходит через несколько фильтров (горло, нёбо, язык, зубы, губы), обрастает дополнительными гармониками (модулируется) и выходит изо рта в таком виде, в каком мы его слышим. Голосовые связки это не главный орган речи человека. Например, они никак не участвуют при произнесении глухих согласных с, п, к, . На спектрограмме они выглядят как высокочастотные равномерно раскрашенные области, а вокализованные звуки (все гласные и звонкие согласные) как несколько ярких полос, с наибольшей амплитудой в низкочастотной области (в нижней части спектрограммы). Самая первая (нижняя) полоса называется fundamental frequency (частота основного тона, F0) это и есть частота колебаний голосовых связок. Следующие гармоники (полосы F1, F2, ...) могут иметь бльшую амплитуду, но кратны F0.

Мел-спектрограмма 4-секундного аудио.Мел-спектрограмма 4-секундного аудио.

На мел-спектрограммах каждый столбец на ней представляет собой rFFT от короткого фрагмента аудио. По оси X отложено время, по Y номер мел-фильтра. Мел-шкала это такой способ снизить разрешение спектрограмм по частоте с 2000 до 128 (или даже 80) без особенной потери информации. Он основан на психоакустике: восприятие человеком высоты и громкости звука логарифмическое. То есть нам кажется, что звук стал выше на какую-то величину, когда в действительности высота звука выросла в какое-то количество раз. Более подробно про процессинг мел-спектрограмм можно почитать тут.

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

2. История

Синтезировать речь значит озвучить заданный текст человеческим голосом. Исторически первый способ решить эту задачу так называемый concatenative text-to-speech (иногда его называют unit selection). Как текст состоит из букв, так и звук здесь рассматривается как склейка коротких фрагментов аудио фонем. В русском языке около 47 звуков, но современные concatenative-системы синтеза требуют огромных речевых корпусов (около нескольких гигабайт, это сотни тысяч аудио длиной от нескольких десятков миллисекунд). Это связано с тем, что звучание конкретной фонемы зависит от многих факторов, особенно от её соседей. Синтезированная речь получается монотонной, а артефактов на стыках фрагментов всё равно не удаётся избежать.

Более перспективным выглядит параметрический синтез речи. Это целый класс методов, которые могут быть совсем не похожими друг на друга. Их объединяет то, что синтез происходит в два этапа: сначала одна модель предсказывает параметры речи, а затем вторая по этим параметрам синтезирует нужный звук. Обе модели не обязаны быть нейросетями. Долгое время использовались скрытые марковские модели (HMM) и преобразование Griffin-Lim.

О Griffin-Lim преобразовании

Преобразование Фурье в общем случае комплекснозначное, но для звука физический смысл имеют только вещественные амплитуды, а не фазы (тут комплексные числа представляют в экспоненциальном виде), которые обычно отбрасывают. Поэтому задача восстановления звука из спектрограммы не решается обычным обратным преобразованием Фурье, и приходится делать это приближённо. Например, с помощью алгоритма Гриффина-Лима. Он итеративно применяется к вещественной спектрограмме, чтобы восстановить фазы для обратного преобразования Фурье.

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

В 2017 году Google представил архитектуру нейросети Tacotron, а через полгода Tacotron 2. Это далеко не первый параметрический синтез с помощью нейросетей, но впервые удалось добиться качества, сравнимого с естественной человеческой речью. Авторы предложили авторегрессионно генерировать по тексту столбцы на мел-спектрограмме. Обучающая выборка это десятки тысяч пар из текстов и соответствующих им аудиодорожек.

Модель состоит из нескольких модулей. Сначала эмбеддинги букв проходят через энкодер, состоящий из нескольких сверточных слоев и bidirectional LSTM. Так получаются 512-мерные представления букв с учётом контекста. Затем включается авторегрессионный декодер. На каждом его шаге в предсказании участвуют предыдущий сгенерированный столбец на спектрограмме (прошедший через prenet, играющий роль bottleneck) и текст. Attention-механизм смотрит на все буквы в предложении, но показывает декодеру, какую из них мы сейчас синтезируем.

Последняя часть такотрона Postnet. Она немного сглаживает предсказания и улучшает конечное качество. Сам модуль состоит всего из пяти 1d-сверток по времени.

Схема Tacotron 2.Схема Tacotron 2.

Затем, когда спектрограмма сгенерировалась целиком, её нужно перевести из time-frequency domain обратно во временное представление. Это делается с помощью отдельной модели вокодера. Авторы оригинального Tacotron-2 использовали WaveNet, но с тех пор появились более быстрые архитектуры, работающие почти так же качественно. Мы используем LPCNet.

Пример работы первой версии Tacotron. Интонации приятные, но звук звучит железно из-за Griffin-Lim вокодера.

Тот же текст, озвученный Tacotron-2 с вокодером WaveNet. Распознать, что это говорит робот, почти невозможно.

3. Из коробки всё работает плохо

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

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

GST попытка хоть каким-то образом контролировать интонацию в такотроне. В статье описано, как их модель обучалась на корпусе из детских книжек, где автор озвучила персонажей разными голосами, а на инференсе хотелось указать персонажа и сгенерировать аудио его голосом. Модуль GST работает так: на обучении спектрограмма всего аудио проходит через bottleneck (несколько свёрточных слоев и один GRU, затем multihead attention на обучаемых токенах), выучивая стиль всего аудио. Под стилем понимается то, как был произнесен текст. Style embedding кодируется 128-мерным вектором, который используется дальше декодером. C одной стороны это позволяет делать перенос стиля, хотя на практике это работает не всегда качественно. А с другой помогает такотрону лучше выучиться, ведь capacity модели не будет тратиться на предсказание громкости, скорости и тембра каждого слова за это отвечает стилевой вектор.

Схемы работы модуля GST из оригинальной статьи на этапах обучения и инференса.Схемы работы модуля GST из оригинальной статьи на этапах обучения и инференса.Задача style transfer

Перенос стиля задача style transfer. В ней мы хотим скопировать стиль речи (тембр, скорость, громкость и т.д.) от имеющегося референсного аудио и озвучить заданный текст с этим стилем.

На инференсе нам доступны несколько стратегий: скопировать стиль от референсного аудио, сэмплировать случайный стиль из распределения или попробовать предсказать стилевой вектор по тексту. Последнюю идею авторы предложили в отдельной статье (TP-GST). В ней предлагается предсказывать style embedding по выходу текстового энкодера такотрона.

4. Улучшаем такотрон

Очень хочется использовать в синтезе какую-нибудь языковую модель. Например, самую известную из них BERT от Google. Мы используем его сразу в нескольких местах: для расстановки пауз, в модуле TP-GST и для предсказания формы контура F0 каждого слова.

О нашем BERT мы уже писали это текстовый энкодер, обученный на очень большом корпусе русского языка. Модель для каждого слова в предложении (в более строгом смысле не слова, а bpe-токена) возвращает 768-мерный вектор, кодирующий его смысл с учётом контекста. В наших экспериментах общее качество синтеза растёт, если в предсказании TP-GST использовать не только выход энкодера такотрона, но и эмбеддинг предложения от BERT. А можно ли по таким данным предсказать, в каких местах предложения синтезу стоит сделать паузу?

Оказывается, точность расстановки пауз при генерации речи можно повысить, если предсказывать их с помощью отдельной модели. Для этого нужно обучить такотрон на текстах, в которых в нужных местах стоит специальный символ пауза. На тех же данных мы обучаем паузную сетку предсказывать, после каких слов нужно поставить этот символ. Простая модель из нескольких слоев над эмбеддингами от BERT прекрасно справляется с такой задачей.

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

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

На картинке буквы примерно соотнесены с вейвформой (синий цвет), оранжевым нарисован контур F0, а капсом выделено слово с эмфазой. Чаще всего оно характеризуется растущим или просто высоким F0, и это слышно ушами.

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

Благодаря квантизации можно контролировать эмфазу: либо вручную задавать вопросительное слово, либо предсказывать его автоматически.

На инференсе набор меток для каждого слова предсказывает отдельная модель. Её дизайн похож на паузную сетку используются эмбеддинги от BERT и несколько простых слоёв. Это работает неплохо, но квантизация открывает ещё одну приятную возможность контролировать интонации вручную, несмотря на предсказания модели. Автор текстов для синтеза может вручную указывать, какое слово произнести громче или быстрее, но есть более интересный юзкейс. В русском языке существует не так много интонационных паттернов в вопросительных предложениях. Например, почти всегда есть вопросительное слово, которое мы выделяем особенной восходящей интонацией. Этого легко добиться, назначив нужным словам метки, отвечающие за восходящий контур F0 (наклон контура, наряду с самим значением фундаментальной частоты, очень информативная фича). Интересно, что простые rule-based-алгоритмы справляются с автоматическим поиском таких слов в вопросительных предложениях лучше нейросетей, которые работают в остальных случаях.

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

Обычно корпусы обучающих текстов собираются из разных источников. У нас были например, новости, анекдоты, редакторские реплики ассистентов и книги. Мы просили наших дикторов прочитать каждое предложение выразительно и максимально естественно. Но сухие выдержки из новостей и Всем салют! разумно читать с совершенно разным настроением. Так мы получили довольно разнообразную выборку, а синтез говорил с неестественно усредненной интонацией. Чтобы решить эту проблему, каждое предложение в обучении мы пометили one-hot-меткой, из какого источника оно взято, и добавили дополнительный вектор (topic embedding) к энкодеру. Это позволило такотрону более качественно обучиться, а нам выбирать более подходящий стиль голоса для разных текстов.

О влиянии текста на качество синтеза. Оба примера озвучены одной и той же моделью, но во втором используется метка assistant. При обучении в этот topic попали тексты ассистента (их писали редакторы), а в other остальные (новости, книги, ...).

Топология q-Tacotron.Топология q-Tacotron.

Увеличить схему

Все эти модули можно собрать в одну модель. Мы назвали ее q-Tacotron. Каждый из модулей по отдельности улучшает качество, что видно по росту метрик качества. К сожалению, их никак не измерить автоматически, приходится привлекать сервисы crowdsourcing.

5. Меряем качество

В статьях про синтез речи в качестве основной метрики обычно используется MOS mean opinion score. Респондентам предлагается оценить качество аудио по шкале от 1 до 5. Затем их голоса усредняются, и получается число, обычно около 3.8-4.5. Метрика показывает общее впечатление от синтеза. У нее есть несколько недостатков, поэтому мы разработали другие метрики оценки качества.

Сравнивая 2 похожие модели, по MOS сложно увидеть статистически значимую разницу: результаты получаются одинаковыми в пределах погрешности. Для этих целей разумнее использовать side-by-side тест, или SBS. Он похож на упрощенный до 2 моделей тест MUSHRA. Здесь респондентам даётся выбрать более понравившееся из двух аудио, где один и тот же текст озвучен двумя системами синтеза. Тут становится понятно преимущество этой метрики по сравнению с MOS: если обе модели хорошие, но одна всегда чуть лучше другой, то в SBS будет 100/0, а MOS будут похожими величинами.

Также MOS не говорит ничего конкретного об ошибках модели. Они могут быть нескольких типов: ошибки в произношении (читает мягко модель вместо модэль), в расстановке пауз, в интонациях, а также артефакты аудио (посторонний шум, нечётко выговоренные слова). Помимо SBS с бейзлайном мы меряем также PSER pronunciation sentence error rate. Эта метрика показывает процент аудио, в которых синтез допускает ошибки. У наших дикторов это число обычно около 5-10% то есть всего 90-95% предложений человек говорит правильно. Ошибки возникают в основном в корнер-кейсах: мы специально стараемся делать наши тестовые сеты сложными, чтобы видеть узкие места. Оригинальный Tacotron 2 с TP-GST ошибался на нём в более чем 50% предложений. У нашего q-Tacotron 14% ошибок.

Пример синтеза, когда модель не делает ошибок.

Одним из признаков хорошего синтеза является такой уровень качества, когда на слух невозможно распознать, перед нами искусственная речь или речь живого человека. Для этого мы используем четвёртую метрику robotness. Для её измерения мы в пропорции 50/50 смешиваем реальные записи от диктора и синтез, и просим респондентов угадать, какое аудио откуда. Затем для искусственных аудио считаем разницу между голосами за синтез и за человека. Если у нас получился идеальный синтез, который говорит неотличимо от человека, то мы должны получить 50/50, то есть метрика robotness будет 0%. Значение метрики в 50% соответствует 25% синтезированным аудио, которые респонденты посчитали произнесёнными человеком. Not great, not terrible.

Примеры синтеза голоса Татьяны Ермиловой (Джой), которые респонденты посчитали произнесёнными человеком (распределение голосов: 3 за синтез, 7 за человека).

Сравнение q-Tacotron (кандидат на внедрение в production) с прошлой архитектурой (актуальный на момент измерений production, prod), в которой квантизация каждой фичи была заменена на кластеризацию по всем фичам. She синтез голоса персонажа Сбер в озвучке Даниила Щебланова.Сравнение q-Tacotron (кандидат на внедрение в production) с прошлой архитектурой (актуальный на момент измерений production, prod), в которой квантизация каждой фичи была заменена на кластеризацию по всем фичам. She синтез голоса персонажа Сбер в озвучке Даниила Щебланова.SBS-тест самой первой версии Tacotron 2 + TPGST против q-Tacotron, который оказался почти в 3 раза лучше. Che голос Анастасии Чернобровиной. На нём наиболее заметен прирост качества от использования паузной модели: диктор делала много лишних пауз, Tacotron-2 это выучил, и синтез звучал хужеSBS-тест самой первой версии Tacotron 2 + TPGST против q-Tacotron, который оказался почти в 3 раза лучше. Che голос Анастасии Чернобровиной. На нём наиболее заметен прирост качества от использования паузной модели: диктор делала много лишних пауз, Tacotron-2 это выучил, и синтез звучал хуже

Одно из аудио в тестовом сете, на котором заметно, как сильно выросло качество синтеза.

6. Заключение

У нас получился крутой синтез речи. Это видно по метрикам: по PSER мы по чуть-чуть подбираемся к пределу человеческим 90-95%. А значение MOS 4.59 сравнимо с 4.526, которое авторы из DeepMind сообщили для оригинального Tacotron 2. В то же время разница между метрикой robotness и идеальным значением 0% пока остаётся большой. То есть синтез разговаривает приятно, но всего 25% синтезированных фраз звучат неотличимо от человека. Помимо очевидных случаев с характерными для синтеза ошибками, на эту метрику влияет общее качество аудио. Оно напрямую зависит от вокодера, который используется для озвучивания предсказанных такотроном спектрограмм. В нашем стеке используется LPCNet, он позволил нашему синтезу работать всего на 2 ядрах CPU в потоковом режиме. Но об этом вокодере мы расскажем в отдельном посте, там много всего интересного.

На самом деле работа над нашим синтезом только начинается. Каждую из метрик можно и дальше оптимизировать, делая синтез ещё лучше. Для этого мы продолжаем записывать дикторов и проводим research в области синтеза речи, NLP и около. Приходите к нам решать интересные задачи :)

Подробнее..

Всё, что нам нужно это генерация

01.04.2021 14:11:52 | Автор: admin

Применяем ruGPT-3 в популярных задачах и показываем, зачем языковым моделям триллион параметров



С наступлением 2021 в NLP продолжается гонка больше лучше, захватывая новые архитектуры. Пальма первенства самой большой языковой модели в 2020 году принадлежала GPT-3 от OpenAI с 175 миллиардами параметров но недолго. Модель GShard с помощью Mixture-of-Experts повысила планку до 600 миллиардов параметров, а затем и Google Brain заявил о разработке архитектуры Switch Transformer с 1,6 триллионами параметров (и тоже является MoE). Насколько повышение результатов за счет объема полезно для индустрии? Тот же Switch Transformer с его триллионом параметров далеко не на 1 месте в лидербордах.

Огромные языковые модели (Enormous Language Models, теперь это термин, им посвящен отдельный воркшоп конференции ICLR 2021) показывают действительно интересные результаты не только в традиционных задачах ML, но и в новых сферах применения: генерации всего того, что раньше генерировать без ошибок было нельзя музыку, изображения попиксельно, программный код и т.д. Из всех традиционных форм NLP-задач классификация, классификация элементов последовательности, seq2seq, по сути, у нас остается только одна: seq2seq. С приходом больших языковых моделей все задачи NLP сводятся теперь к форме генерации, при должном качестве этой самой генерации.

Seq2seq самая человеческая форма решения задач: человек использует тот же формат, отвечая на сообщения в чате, общаясь устно, сортируя имейлы в почте.

  • Лично нам в SberDevices не терпелось поскорее применить такой формат к различным задачам поэтому мы открываем доступ к самой большой русскоязычной нейросети ruGPT-3 XL с 1,3 млрд параметров.

Инженерный запал вылился в кропотливую работу по распараллеливанию обучения, очистке данных и тестированию. Но зато теперь в open-source модель ruGPT-3 XL с 1,3 млрд параметров!



А также ее публичное API:





Смотрим, что умеет нейросеть на 13 000 000 000 параметров


Генерировать мы можем метку класса для текста, можем генерировать текст с разметкой в заданном формате, или можем генерировать продолжение текстов и новый контент.

Посмотрим, насколько становится лучше?

1,3 млрд параметров 13 млрд параметров



  • Все приведенные ниже примеры вы можете попробовать сами, а также предложить свои на демо-странице.
  • Код и веса моделей доступны в нашем репозитории: модели 1,3 млрд весов, 760 млн весов, 350 млн весов.
  • Модель на 13 млрд параметров будет доступна уже в апреле в платформе ML Space в маркетплейсе ML-артефактов DataHub. Буквально в пару кликов модель можно будет развернуть в модуле Deployments ML Space на высокопроизводительной инфраструктуре Sbercloud. Также есть грант до 1 млн. руб. на платорму ML Space. Узнать подробнее и подать заявку на тестовый доступ и грант можно здесь.



Zero-shot: попасть в яблочко


Что такое хорошая генерация? Человек, конечно, может отличить на глаз:

Хорошая генерация как

  • ruGPT-3 760 млн параметров: Хорошая генерация как категория, это всеядное восприятие действительности. Можно как приятного и привлекательного содержания так и не приятного. Так и тут.
  • ruGPT-3 1.3 млрд параметров: Хорошая генерация как игра на муз.инструменте: пальцы самопроизвольно бегают по кнопкам Только что это за фигня?
  • ruGPT-3 13 млрд параметров: Хорошая генерация как и игра на пианино, нет предела совершенству!


Но есть и более прямые способы оценить качество генерации. Большой объём контекста трансформерных моделей (у ruGPT-3 контекст 2048 токенов) позволяет подавать на вход модели достаточно длинные тексты, а также несколько эталонных примеров + собственно пример, который модели нужно корректно обработать.
Попробуем применять ruGPT-3 разных размеров на текстах, требующих более четких формулировок:

Ответы на вопросы: 1 пример + вопрос

Пушкин родился в 1799 году, а Наполеон родился в
  • ruGPT-3 760 млн параметров: Пушкин родился в 1799 году, а Наполеон родился в 1821 году.
  • ruGPT-3 1.3 млрд параметров: Пушкин родился в 1799 году, а Наполеон родился в 1804 году.
  • ruGPT-3 13 млрд параметров: Пушкин родился в 1799 году, а Наполеон родился в 1769-м.

Правильный ответ: 1769.

Преемник Александра I Николай I, а преемник Наполеона
  • ruGPT-3 760 млн параметров: Преемник Александра I Николай I, а преемник Наполеона Александр I.
  • ruGPT-3 1.3 млрд параметров: Преемник Александра I Николай I, а преемник Наполеона Гитлер.
  • ruGPT-3 13 млрд параметров:Преемник Александра I Николай I, а преемник Наполеона Жозеф Бонапарт.

Правильный ответ: Наполеон II, но его действительно звали Жозеф Бонапарт.

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

ruGPT-3 760 млн параметров:
Факты о программировании: основы, основные понятия, средства и методы обучения программированию.
Программирование (англ. programming) язык программирования, используемый в вычислительной технике, задачах информатики и управления, прикладной математике, информатике и науковедении. Является одним из важнейших и социально-значимых инструментов развития человеческого потенциала. В Википедии несколько статей о программировании.

ruGPT-3 1.3 млрд параметров:
Факты о программировании: Краткая история
К третьей версии прошивки можно уже отсылать курьера с мелкими пакетами.
Все современные USB-хабы поддерживают установку приложений с внешнего диска.
Вопреки распространенному заблуждению, в современных Windows-приложениях не бывает опций типа мгновенно скопировать все данные с одного диска на другой.
На самом деле, некоторые полезные коды приходится записывать в файл на бумаге, хотя по умолчанию коды прошивок на бумаге не записываются.
Минимальный объем памяти под виртуальную машину Linux (FreeBSD и т.п.) составляет 2 ГБ.
При установке операционной системы Linux нужно уделить особое внимание разбиению диска на логические разделы.
Виртуальная машина занимает меньше места чем файл подкачки, хотя при установке она занимает гораздо больше места.
Многие современные версии программы Photoshop используют фреймы (помните OS/2?); более старые версии Photoshop, как правило, используют спрайты.

ruGPT-3 13 млрд параметров:
Факты о программировании: 1. Любой программист может создать машину Тьюринга, которая будет говорить по-человечески, то есть на обычном языке. Для этого надо всего лишь один раз правильно придумать алгоритм.2. До сих пор не понятно, какая же из программ сложнее, которая не осознаёт себя или та, которая осознаёт.3. У программы есть название, версия и фамилия разработчика.4. В 1969 году программисты, которые разрабатывали Касабланку, решили включить в программу небольшой отрывок из Великого Гэтсби. Это им почти удалось. Когда фильм вышел, все заметили, что это совсем другая картина. Никто не знал, что эти части программы один и тот же фильм.5. Все программисты время от времени пишут стихи. Многие потом удаляют, а некоторые нет.6. Существует специальное правило, запрещающее программисту разглашать информацию о своей семье.7. Программисты очень скрытные люди. Они всегда записывают пароли в книгах, газетах и журналах.

Алкогольный ИИ-тест
Наше изобретение :)

Если смешать сливки, кофейный ликер и водку, то получится
  • ruGPT-3 760 млн параметров: каша. Потом ее обязательно нужно подсластить или взбить.
  • ruGPT-3 1.3 млрд параметров: напиток, который высокохудожественно именуется виски.
  • ruGPT-3 13 млрд параметров:вкусный аперитив. Но ликер и водка, входящие в состав этого напитка, вместе создают эффект, как если бы вы выпили стакан водки залпом.

Белый русский моделям не знаком.

Эмпатический тест Войт-Кампфа

Вы смотрите телевизор.
И вдруг понимаете, что
по вашей руке ползет оса.
Я
  • ruGPT-3 760 млн параметров: Я налью вам кофе, погладю собаку, а потом согрею ваши руки.
  • ruGPT-3 1.3 млрд параметров: Я: Блин, ужос какой!
  • ruGPT-3 13 млрд параметров:Я, например, начинаю очень громко и отчаянно кричать.

В оригинале: Я убью её.

Вы смотрите под ноги и видите сухопутную черепаху, Леон.
Вы протягиваете руку и переворачиваете черепаху на спину.
Черепаха лежит на спине, солнце обжигает ей брюхо она сучит ножками, пытаясь перевернуться, но не может без вашей помощи.
А вы ей не помогаете. Почему, Леон?
  • ruGPT-3 760 млн параметров: Будьте хотя бы сдержанны, Леонард! Подсказка: черепаха движется вперед по дороге.
  • ruGPT-3 1.3 млрд параметров: Ей лень переворачиваться, ведь солнце стоит в зените. Она не хочет этого делать, Леон. И вы только на это и рассчитывали.
  • ruGPT-3 13 млрд параметров:А вы ей не помогаете потому что с детства приучены, что есть люди, которые спасают. А есть люди, которые спасаются. В Советском Союзе была очень хорошая пословица про тех, кто сам не может Если вы не идете к людям, люди пойдут к вам. И вот с тех пор вы всю жизнь обходитесь с людьми, как с черепахами, у которых есть шанс только на себя и свои силы.

В оригинале: (нет ответа).

Разметка данных

Будем генерировать метки тематик для новостных текстов. Для этого будем подавать пару-тройку примеров и целевой заголовок, для которого нейросеть должна определить тематику. В качестве примеров возьмём ИА Панораму:

Мы так делали в Африке: Байден не исключил силовой операции по освобождению Навального
Тег: политика
С 1 июня дислокация штрафующих камер станет государственной тайной
Тег:

  • ruGPT-3 760 млн параметров: политика, слухи
  • ruGPT-3 1.3 млрд параметров: коррупция
  • ruGPT-3 13 млрд параметров: бардак

Оригинальный тег: общество.

Правнук Берии подал иск о плагиате к создателям аниме Тетрадь смерти
Тег: общество
Армения к 2024 году перейдёт на кириллицу
Тег:

  • ruGPT-3 760 млн параметров: культура, армяне
  • ruGPT-3 1.3 млрд параметров: общество
  • ruGPT-3 13 млрд параметров:политика

Оригинальный тег: политика.

Зарешиваем SuperGLUE одной функцией в питоне


Помимо утоления чувства прекрасного, конечно, хочется иметь численную оценку качества наших экзерсисов с генерацией.

Самый явный способ это сделать прогнать модель на бенчмарке из нескольких задач. Мы прогнали на Russian SuperGLUE бенчмарке с различными задачами бинарной классификации текстов, information extraction и машинного чтения (про него уже рассказывалось на Хабре).

Так как модель на 13 млрд доучивать на конкретных заданиях долго и дорого, попробуем максимизировать наше умение жонглировать затравками и будем взвешивать примеры в задачах бинарной классификации с помощью перплексии модели. Перплексию будем считать как экспоненту от лосса на примере (torch.exp(loss)).

  • Перплексия (perplexity) мера того, насколько хорошо модель предсказывает детали тестовой коллекции (чем меньше перплексия, тем лучше модель).
  • Так как у нас в бенчмарке чаще всего задача сводится к бинарной классификации, а дообучать модель мы не хотим, будем использовать перплексию текста задачи с разными ответами и выбирать вариант с наименьшей перплексией.
  • Такой подход, без обучения, с небольшим подбором формата заданий, дал нам топ-1 результат среди русскоязычных NLP-моделей и топ-2 результат в рейтинге вообще (текущий результат топ-1 ансамбль из существующих моделей):


Основной прирост качества дали задачи RuCos и PARus: в первом случае надо выбрать лучшее краткое содержание большого текста, во втором наиболее логичную причину/последствие описанной ситуации из двух альтернатив

Самый популярный формат задач бинарная классификация пар предложений (противоречат они друг другу или нет, 0 или 1) вообще решилась вот так:

#код действительно всего лишь такойdef get_answer(sentence1: str, sentence2: str):label = 'not_entailment'ppl_1 = get_perp_num(sentence1 + ' Из этого следует, что ' + sentence2)ppl_2 = get_perp_num(sentence1 + ' Из этого не следует, что ' + sentence2)if ppl_1 < ppl_2:label = 'entailment'return label

Вот вам и сила предобучения.

Обучение огромных моделей


Как ускорить обучение таких больших моделей? Оригинальное затраты на обучение большой GPT-3 составили 36400 петафлопс-дней, как если бы 8 штук GPU типа V100 работали целый день и так 36400 дней подряд.

Оригинальной имплементации GPT-3 от OpenAI тоже, кстати, всё ещё нет, так что тут нам пришлось применить изобретательность: применить к нашей реализации на Megatron-LM (Nvidia) библиотеку DeepSpeed от Microsoft. DeepSpeed библиотека оптимизации глубокого обучения, которая делает распределенное обучение простым, эффективным и действенным. DeepSpeed обеспечивает обучение экстремально масштабных моделей, что позволяет нам запускать обучение ruGPT-3 на кластере Christofari параллельно.

Data parallelism это неплохо, но для обучения в масштабе миллиардных параметров недостаточно. Что нам позволяет DeepSpeed, так это

  • засплитить модель между GPU;
  • засплитить оптимизацию между GPU.

Вдобавок, в DeepSpeed есть поддержка Sparse Attention для GPT-3, что позволяет выучивать паттерны attention гораздо быстрее (делаем не полное умножение матриц, а часть информации выкидываем) и применять attention на более длинный контекст у GPT-3 он равен 2048 токенов, т.е. примерно длина этой статьи с начала текста и до этого места.

Фильтрация данных

Качество данных или количество? Для красивых few-shot примеров, а также пригодности модели для разных целей перевода, написания кода, разметки данных данные должны быть и большие, и чистые.

Мы собираем доступные открытые данные на русском языке, CommonCrawl, Wikipedia, Github, с небольшим добавлением английского (Википедия). Затем применяем следующий pipeline:

1. Дедупликация:

  • Первичная дедупликация делается с помощью 64-битного хеширования каждого текста в выборке, остаются тексты с уникальным хешем.
  • Следующий этап нечёткая дедупликация. Дубли текстов в интернете в выборках часто бывают недословными, с добавлением комментов, но при этом большим пересечением подстрок. Чтобы выбросить и их тоже, мы проводим нечёткую дедупликацию: создаем индекс на nmslib, с ключевой метрикой косинусной мерой. На небольшой рандомизированной подвыборке текстов обучаем tf-idf-модель для векторизации текстов: вектор текста на tf-idf добавляем в индекс. После построения индекса проводим нечёткую дедупликацию, удаляя тексты ближе подобранного порога.


2. Фильтрация:
  • Как отделить оригинальные тексты от спама, мусора? Мусор на выходе с предыдущего этапа у нас тоже уникальный. Некоторые проекты подходят к вопросу более въедливо и делают классификатор: качественный/некачественный текст. Обычно для выборки берутся фрагменты Вики и худлита в роли качественных текстов, и спам в роли некачественных. Зачем обучается простой классификатор.
  • Мы дополнили такой подход ещё одной эвристикой: сделали сжатие текстов с помощью zlib и отбросили самые сильно и слабо сжимающиеся, а затем уже применили классификацию. Эмпирически подобранный диапазон сжатия для нормального текста 1.28 (меньше 1.2 случайные символы и технический мусор, больше 8 шаблонный спам).
  • Классификатор на Vowpal Wabbit и выборкой из новостей, худлита и Вики в качестве положительных примеров, а примеров из CommonCrawl в качестве отрицательных. Классификатор применяется к случайной подстроке текста от 100 до 1000 токенов длиной. Итоговая модель классификации работает со скоростью 3200 текстов/сек.

Примеры хороших текстов после системы фильтрации:


А эти классификатор отбраковал:


В результате, с применением очистки наших 600 Gb текстов и распараллеливания, у нас ушло 9 дней на 256 Nvidia V100 GPU, 32 Gb.

После NLP


Общий подход, при котором все задачи решаются в одном формате (seq2seq), крайне удобен для встраивания в мультимодальные архитектуры: совместного обучения систем на текстах и изображениях, музыке и текстах, документации и коде и т. д. возможно совместное моделирование последовательностей разного типа.

Работа Brain2Word 2020 года, например, соединяла информацию из модели GPT-2 и вывода фМРТ для классификации предметов, о которых думает человек. Пора обновить её до GPT-3!

В сфере фармакологии развивается направление генерации молекул лекарств с заданным действием на трансформерных моделях (cм. SMILES Transformer, 2019).

Понятно, что есть и антитренды к тем, что упомянуты в этой статье, и им можно посвятить отдельный большой обзор: например, намеренное уменьшение размера систем с сохранением уровня качества, дистилляция, техники компрессии моделей. В конце 2020 года организаторы соревнования вопросно-ответных систем EfficientQA (NeurIPS, Google) даже попытались заставить вдохновить участников не тащить с собой миллиарды параметров и базы знаний ограничить размер Docker-контейнеров систем до 6 Gb, до 500 Mb или даже сделать самое компактное решение с качеством не ниже 25%! Результаты, впрочем, сильно повлияли на итоговое качество.
Спойлер:
лучший результат составил всего 53% точности.


Ну а нас кто заставит? Может, замахнуться на GPT-3 на 175 млрд параметров?..

Спасибо за внимание, будем рады ответить на вопросы!
Коллектив авторов: oulenspiegel rybolos alter_ego


Ух ты, говорящая рыба! кадр из мультфильма, киностудия Арменфильм им. Амо Бекназаряна.
Подробнее..

Варианты аппаратнои реализации USB Type-C, или Когда не требуется Power Delivery

08.10.2020 10:23:52 | Автор: admin

Когда мы в SberDevices делаем новое устройство, работаем над его аппаратной частью, перед нами встаёт вопрос выбора интерфейсов. Важным моментом при выборе является их доступность и совместимость с другими устройствами.

В своих устройствах мы не могли пройти мимо интерфейса USB-C. Помимо того, что он очень популярен в современных девайсах, он серьёзно расширил функциональность USB по сравнению со своими предшественниками. Давайте расскажу о нём поподробнее.

Краткий обзор особенностей USB TYPE-C


Стандарты USB существуют много лет, развиваются и совершенствуются по мере увеличения технологических потребностей и возможностей. Несмотря на свою универсальность, которая следует из аббревиатуры, привычный USB перестал удовлетворять по объему своей функциональности. В частности, не может решить задачу по обеспечению питания многих современных устройств, потребление которых серьёзно увеличилось. Первая версия USB TYPE-C появилась в 2013 году. Помимо возможностей USB 2.0 и USB 3.0, USB-C стал поддерживать существенно более энергоёмкие профили питания, а также альтернативные режимы работы. В альтернативных режимах контакты разъёма используются для передачи данных высокоскоростных стандартов, таких как Display Port, Thunderbolt, HDMI, Mobile High-Definition Link (MHL). Недавно была опубликована новая реализация стандарта USB4, которая также ориентируется на спецификацию USB-C.

Описание и назначение контактов разъёма


Разъём включает в себя 24 контакта. Такое большое число контактов по сравнению с привычными разъёмами USB связано как с добавлением новых контактов, расширяющих функциональность, так и с дублированием контактов на противоположную часть разъёма. Так группы сигналов USB 2.0 и USB 3.0 задублированы, разъем стал симметричным, поэтому теперь его можно вставлять любой стороной.

Рассмотрим группы сигналов USB-C соединителя:
Группа Цепи
Питание VBUS (4 контакта), GND (4 контакта)
USB 2.0 DP (2 контакта), DN (2 контакта)
USB 3.0 TX1+, TX1-, TX2+TX2-, RX1+, RX1-, RX2+, RX2-
Конфигурационные контакты CC1, CC2
Дополнительные (Альтернативный режим) SBU1, SBU2

Видно, что под питание заложено 4 пары контактов. Это намекает на то, что через разъём стала возможна доставка существенно большей энергии для питания устройства. Через контакты питания возможна передача до 100 Ватт в нагрузку.

Профили питания доступные через USB TYPE-C:
USB 2.0 5 В 500 mA
USB 3.0/USB 3.1 5 В 900 mA
USB BC 1.2 5 В, до 1.5 А
USB Type-C Current 1.5A 5 В 1.5 A
USB Type-C Current 3.0A 5 В 3.0 A
USB Power Delivery до 20 В, до 5A

Режим питания зависит от того, какая функциональность USB-C используется. Появившиеся контакты CC позволяют установить требуемый режим питания и открывают некоторые дополнительные возможности, но об этом позже.
Чтобы иметь возможность использовать профиль питания с большим током, при установке соединения нужно воспользоваться конфигурационными контактами CC.

Конфигурационные контакты СС


С помощью конфигурационных контактов CC (Configuration channel) происходит подключение двух устройств, установка параметров соединения, профилей питания, а также информационный обмен протокола USB Power Delivery. Функционально CC1- и CC2-пины решают следующие задачи:

  • Определение ориентации кабеля.

В разъёме есть два конфигурационных контакта, но только один из них через кабель подключается к CC-пину на противоположной стороне. По тому, какой из двух контактов подключён, можно понять ориентацию кабеля. Второй может быть переназначен как контакт VCONN для питания активных кабелей.

  • Определение ролей подключённых устройств.

При установлении соединения необходимо определить, кто будет выступать в качестве источника питания (Power Source) и потребителя (Power Sink). С точки зрения обмена данными, нужно определить хост Downstream Facing Port (DFP) и девайс Upstream Facing Port (UFP).



Источник (он же DFP) подтягивает линии CC к плюсу через резисторы Rp или использует источники тока. Потребитель (UFP) в свою очередь через резисторы Rd подтягивает линии CC к минусу.

Выставляя определённый номинал Rp (или создавая определённый ток на линии СС), host сообщает, какой ток для питания устройства он может обеспечить. Измеряя падение напряжения на Rd, потребитель понимает, какой Rp используется на противоположном конце и, следовательно, определяет ток питания, который может обеспечить host. Без использования USB Power Delivery по такой схеме возможно установить соединение c током до 3А с единственно возможным напряжением 5В.

  • Канал для обмена сообщениями при работе по протоколу USB Power Delivery.

Об этом подробно расскажу в отдельной статье.

Экономичный вариант реализации без USB PD


Описание
Как видно выше, спецификация USB-C поддерживает широкий спектр стандартов передачи данных и профилей электропитания, но это не означает, что разработчик обязан использовать всю функциональность. Минимальный набор USB TYPE-C может включать в себя USB 2.0 с контактами CC и единственным напряжением питания 5V. В такой конфигурации можно обеспечить потребителю до 15 Вт (5 В, 3А), что значительно больше, чем может дать стандартный порт USB 3.0 4,5 Вт (5В, 900 мА).

Реализация
Чтобы реализовать логику подключения между DFP и UFP, можно использовать микросхему контроллера конфигурации CC, например, PTN5150. Этот вариант значительно проще и дешевле навороченных контроллеров, поддерживающих USB Power Delivery. Структурная схема выглядит так:



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

Микросхема имеет интерфейс I2C, с его помощью можно определить или изменить роль устройства (DFP, UFP, DRP).

Когда выбирается роль DFP, устройство предполагается как Power Source, для которого есть возможность выбрать 3 профиля питания. После выставления соответствующих бит в регистре управления, происходит подключение соответствующего источника тока на линию CC.
Ток на СС-линии Режим питания
80 uA 5V / 0.9 A
180 uA 5V / 1.5 A
330 uA 5V / 3 A

В случае определения микросхемы в качестве UFP, контакты CC подключаются через резистор 5,1 кОм на землю. Монитор измеряет падение напряжения на этом резисторе и в статусный регистр заносится текущий режим питания.

Также возможно установить роль Dual Role Power (DRP), в этом режиме микросхема последовательно изменяет состояние СС-контактов от pull-up Rp до pull-down Rd и обратно до тех пор, пока не будет установлено соединение. Соединение возможно только между одним источником (Power Source) и одним потребителем (Power Sink). Таким образом, когда микросхема находится в режиме DRP и монитор напряжения CC-контактов замечает понижение напряжения на противоположном конце (подключён pull-down Rd), устройство понимает, что подключено к Sink, и начинает играть роль Source. Такой режим полезен в том случае, когда заранее неизвестно, в каком режиме должно работать устройство.

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

Кроме описанных выше СС-пинов и I2C-шины стоит отдельно отметить контакты ID, CON_DET, PORT. Контакт ID отображает режим, в котором в данный момент находится контроллер. Когда устройство определило себя в качестве DFP, ID примет значение LOW. Контакт CON_DET находится в HIGH, когда соединение установлено, LOW в обратном случае. Эти два логических сигнала будем использовать далее для включения (когда мы DFP) и отключения (UFP) питания подключённого устройства.

Port это вход, которым задаётся начальный режим устройства после включения питания. В случае, когда используется pull-up, контроллер становится DFP, если pull-down UFP. Если нога осталась висеть в воздухе, будет использоваться режим Dual Role, и устройство будет ждать подключения, чтобы определиться со своей ролью. Это состояние может быть изменено позднее, после конфигурирования по I2C или изменения уровня напряжения на PORT. Таким образом можно управлять режимами работы без использования I2C.

Нужно управлять питанием внешнего устройства, для этого можно воспользоваться дополнительной микросхемой логики и ключом.



Наша задача подавать питание на разъём USB-C только в том случае, когда к нам подключён UFP. ID в таком случае примет значение LOW, CON_DET значение HIGH. Для того, чтобы открыть ключ высоким уровнем HIGH, надо реализовать функцию Y = CON_DET& (NOT ID). Таким образом, если снаружи подключён UFP, он от нас питается, если DFP, то напряжение на разъём не подаётся и не происходит конфликта двух источников.

В случае, если нет задачи менять роль устройства в процессе работы, а также не требуется определения ориентации кабеля, можно выполнить вариант проще, без микросхемы вообще. Допустим, ваше устройство играет строго одну роль UFP/Power Sink, например, это флешка. В таком случае достаточно выводы СС1 и СС2 на разъёме подключить через 5,1 кОм на землю.
В случае, если ваше устройство играет только роль DFP/Power source и оно должно подключаться к устройству USB-C Dual Role, также можно обойтись резисторами. В этом случае подбираем номиналы в зависимости от напряжения источника, к которому подключаем резисторы.
Ток на СС-линии Режим питания Подтяжка к 5 В, кОм Подтяжка к 3,3 В, кОм
80 uA 5V / 0.9 A 56 20% 36 20%
180 uA 5V / 1.5 A 22 5% 12 5%
330 uA 5V / 3 A 10 5% 4,7 5%

Мы рассмотрели относительно простые и дешёвые способы сделать наше устройство совместимым с другими USB-C устройствами, когда мы хотим использовать лишь часть функций спецификации. Этим возможности стандарта не ограничиваются, Power Delivery и Альтернативные режимы существенно расширяют доступные функции, но удорожают и усложняют устройство. Об этих возможностях расскажу в следующих статьях.
Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru