Если посмотреть на пример нейросети на numpy, то слои нейронов это массивы с активациями всех нейронов слоя. То есть сам по себе нейрон можно представить как ячейку с каким-то значением (активацией нейрона) (что видно по картинке демонстрирующей взвешенную сумму). А все вычисления активации происходят на межслоевом уровне при помощи перемножения матрицы весов с массивом активаций слоя.
В изначальный примерах, которые написаны на голом Python в классе нейрона есть функция активации, вес и смещение. Нейроны входного слоя у нас уже есть (это сама картинка), нам не нужно их считать и у них нет весов, смещений и функции активации, по этому в коде они и не представлены. А в каждом нейроне второго слоя 784 входа потому, что каждый нейрон связан со всеми нейронами предыдущего слоя.
В статье рассматривается простейшая нейросеть, для базового понимания ее устройства. Как основной пример я взял классификацию рукописных цифр из набора MNIST. Я посчитал, что на этом примере рассматривать нормализацию будет не совсем корректно.
Для конкретной задачи (например определения номера авто с фиксированным шрифтом) классические алгоритмы работают отлично. Но если речь идет о рукописных вариантах (с разным наклоном, толщиной линий, разрывами), то подбиравть вручную вейвлеты будет крайне сложно и долго.
Про функции активации и смещение просто сошлюсь на абзац из статьи:
Активация нейрона должна быть в определённом интервале, а взвешенная сумма может выходить за его пределы. Значит, нужно применить функцию, которая приведёт значение в нужный интервал. Эту функцию называют функцией активации (activation function) нейрона. Перед применением функции активации к взвешенной сумме прибавляется коэффициент сдвига (bias), который позволяет сдвигать функцию влево или вправо. Итого: функция активации применяется к сумме взвешенной суммы и коэффициента сдвига.
Тема смещения действительна не была раскрыта в должной мере, но зачем нужна функция активации в статье четко сказано.
В статье сказано:
представим, что у нас всего 3 параметра. Визуализировать трёхмерное пространство уже не так сложно. Представьте, что функция потерь, которую мы хотим минимизировать, – это ландшафт с горами и долинами.
И это корректно. Три параметра – три оси (x , y, z). В каждой точке этого 3д пространства у loss есть какое-то значение, если продолжать аналогию со слепым на ландшафте, то это значение – ощущение слепого крутизны склона. 2 параметра дали бы 2д плоскость, а третьей осью мог бы стать loss (что часто используется, т.к. просто для отрисовки). Мой пример сложнее для отрисовки, но для метафоры со слепым человеком абсолютно нормальный и понятный. Считаю, что в текстовом формате такой пример проще для понимания.
Статья объясняет не почему, а как работают нейросети и предназначена для ознакомления людям, который только погружаются в эту тему или просто для общего понимания
Простые задачи животные и даже растения благополучно решают на автопилоте не имея никакого интеллекта.
Этим предложением вы однозначно говорите, что у животных нет никакого интеллекта, но ведь это не так. Уже давно ученые доказали, что многие виды животных способны обучаться, использовать орудия труда, запоминать события и обладать социальной структурой. По этому они тоже обладают интеллектом.
если уровень интеллекта ниже 70, то такой человек мало чем в интеллектуальном плане отличается от животных, к сожалению. Он не может решать сложные задачи, хотя и обладает интеллектом.
Только что вы сказали, что животные не имеют никакого интеллекта, а потом сравниваете интеллект человека и животных. А еще недавно вы говори, что умение решать сложные задачи и является интеллектом, а здесь говорите что человек обладает интеллектом, даже если не умеет решать сложных задач.
Вы сами себе противоречите, пожалуйста, закончите эту дискуссию
как и под программу множества приборов. Например, мой газовый котёл включается и выключается в зависимости от температуры в комнате. ;)
Прошу заметить, что помимо определения интеллекта, в статье упоминался ключевой фактор искусственного интеллекта – обучаемость.
То есть искусственным интеллектом можно назвать любую программу, которая может решать задачи определенного вида? Почти. ИИ должен иметь возможность обучаться. Обучение – это возможность решать задачи нового типа (которые изначально модель решать не могла), путем добавления новых знаний без переписывания исходного кода.
Именно по этому мое определение не попадает под простую программу приборов
Я рассказал про 4 основные разновидности ИИ, а эволюционные вычисления относятся к эмерджентному подходу.
Эволюционные вычисления относятся к эмерджентному подходу, так как:
У них нету базы знаний, система сама находит путь к цели
Сложное поведение выстраивается из простых элементов
Правда сейчас, все более часто вижу, как люди выносят категорию «Вычислительный интеллект» (Computational Intelligence), куда включают:
Нейронные сети.
Эволюционные вычисления.
Нечеткую логику.
и там эволюционные вычисления считаются за отдельную разновидность, но лично я считаю их подвидом эмерджентного подхода
Постараюсь в ближайшее время написать еще несколько статей в которых более подробно будут разбираться отдельные категории ИИ, их подвиды, приемущества и недостатки
Как я написал в самой статье, понятие интеллекта может быть интерпритировано по разному, особенно в зависимости от контекста, и вообще этот вопрос можно назвать филосовским. То определение которое привели вы, абсолютно верно. Однако мое тоже отражает основную суть интеллекта и больше подходит под то, что в современном мире называют ИИ. Вы сами заметили, что исходя из вашего определения, ничего из ныне существующих технических решений нельзя назвать интеллектом, по этому в сфере ИИ это определние на данном моменте развития технологий можно упростить.
По поводу определения знаний, я соглашусь, что человек может получать их не только из коммуникации, но еще и из взаимодействия с внешним миром. Возможно об этом стоило упоминуть в статье, но в контексте технических систем эта недосказанность не имеет никакого смысла, потому что ИИ не может получать знания из взаимодействия с внешним миром, он может получать знания только из коммуникации с людьми и другими системами.
и по поводу этого
Вот когда хоть какой-нибудь ИИ научится делать то же самое, тогда и он тоже наконец-то станет интеллектом. ИИ классифицируется на ANI (узкий или слабый ИИ), AGI (общий ИИ, гипотетическая модель) и ASI (гипотетический ИИ, превосходящий человека). Сейчас, когда речь идет про существующий ИИ, предполагается ANI (потому что остальные модели на данный момент только гипотетические). А то что описали вы больше похоже на AGI
Подпись будет действовать только в паре с этим эфемерным ключем, что не даст его подменить. А публичный эфемерный ключ работает только в паре с приватным, из-за чего "человек посередине" (не зная приватного ключа) не сможет им воспользоваться для создания соединения с клиентом. Подпись служит защитой от подмены ключа
По поводу установки долгоживущего соединения, идея не плохая, но механизм возобновления сессии будет надежнее, при этом особо не влияя на производительность.
Если мы запекаем в бинарнике приложения ephemeral ключ то на сервере нужно будет хранить приватную часть этого ключа не все время а только до выхода новой версии приложения (а если приложение активно развивается то выход минорной версии происходит обычно не реже чем раз в месяц)
Не помню или упоминал в статье, но я хочу сделать чтобы старые клиенты (которые по какой-либо причине не могут получить обновление) могли продолжать работу с обновленными серверами. И если зашивать ключ в бинарник, то без обновления клиента ключ становится статичным, что не безопасно.
попыткой сгладить потенциальный взлом сервера (а иначе как этот долговременный приватный ключ может утечь?) и я такой себе дальше думаю - если уж произошел такой взлом с утечкой приватного ключа то мне кажется что возможность расшифровать перехваченный ранее обмен сообщениями это будет не самая большая проблема в сравнении с потенциальным доступом (в случае взлома) ко всем данным пользователей
Если публичный ключ будет известен клиенту, то приватный можно будет подобрать. Да, шанс подобрать приватный ключ не велик, однако никогда не равен нулю
В начале тоже не понимал в чем вообще смысл этого "Лишнего шага", пока писал свой протокол как раз и разабрался в этом.
Суть в том, что S - результат заранее известной математической операции, по этому оно может иметь предсказуему структуру, иметь какой-то паттерн. Например, каждый второй бит S обязательно 0 (пример взят из воздуха). Из-за чего криптоанализ упрощается и надежность падает. Деревация ключа делает его чуть более непредсказуемым.
А еще S может быть просто слишком длинным или слишком коротким для использования в качестве ключа шифрования, деревация помогает привести его к нужной длине используя весь ключ (а не просто отсечь лишние байты, или заполнить недостающие нулями)
Да, не изобретать велосипед в криптографии, как и в большенстве других отраслей, справедливо для продакшн‑систем. Но пет‑проекты как раз и нужны для того, чтобы экспериментировать. Я не пытался создать промышленный стандарт, этот проект был способом глубже разобраться в теме и поделиться опытом.
Как сказано в начале статьи этот протокол в первую очередь пишется для месенджера, где будет создаваться долгоживущее соединение и все данные будут перегоняться через него.
Идея кодирования API ручки в номере порта довольно интересная и поможет сэкономить байты в UDP пакете, но поскольку в моем сценарии предполагается долгоживущее соединение, использование одного порта для всей сессии будет более выгодным и простым в менеджменте. Однако, этот подход можно добавить в виде опциональной возможности, которая будет выгодна сервисам, создающим единичные, короткие get запросы. Не знаю на сколько целесообразно смешивать два подхода в рамках одного протокола и это внесет сложность в реализацию, по этому на данный момент реализовывать эту возможность я не стану, но обязательно подумаю над этим позже.
Оптимизация раундтипов хорошая возможность для улучшения. Это очень важно для скорости запуска и бесшовных переподключений, но внедрение нулевого раундтипа приведет к сложностям в виде защиты от reply атак, что может быть критично. К тому же я описывал механизм востановления сессии, который не успел реализовать, который должен значительно сократить время повторного подключения. И действительно нужен ли нулевой раундтип в добавку к механизму возобновления сессии нужно будет проверять эксперементально, после его реализации. В первой версии протокола я оставлю текущую схему, но если эксперемент покажет критические зависания связанные с 1-RTT, придется его оптимизировать.
А запекание ephemeral ключа приведет к проблемам с PFS, а в данном случае для меня безопасность приоритетнее скорости
Если посмотреть на пример нейросети на numpy, то слои нейронов это массивы с активациями всех нейронов слоя. То есть сам по себе нейрон можно представить как ячейку с каким-то значением (активацией нейрона) (что видно по картинке демонстрирующей взвешенную сумму). А все вычисления активации происходят на межслоевом уровне при помощи перемножения матрицы весов с массивом активаций слоя.
В изначальный примерах, которые написаны на голом Python в классе нейрона есть функция активации, вес и смещение. Нейроны входного слоя у нас уже есть (это сама картинка), нам не нужно их считать и у них нет весов, смещений и функции активации, по этому в коде они и не представлены. А в каждом нейроне второго слоя 784 входа потому, что каждый нейрон связан со всеми нейронами предыдущего слоя.
В статье рассматривается простейшая нейросеть, для базового понимания ее устройства. Как основной пример я взял классификацию рукописных цифр из набора MNIST. Я посчитал, что на этом примере рассматривать нормализацию будет не совсем корректно.
Вейлеты могут быть заданы вручную. А могут при помощи машинного обучения, методами градиентного спуска, что является модификацией нейросетей.
Хорошо, давай по порядку:
Для конкретной задачи (например определения номера авто с фиксированным шрифтом) классические алгоритмы работают отлично. Но если речь идет о рукописных вариантах (с разным наклоном, толщиной линий, разрывами), то подбиравть вручную вейвлеты будет крайне сложно и долго.
Про функции активации и смещение просто сошлюсь на абзац из статьи:
Тема смещения действительна не была раскрыта в должной мере, но зачем нужна функция активации в статье четко сказано.
В статье сказано:
И это корректно. Три параметра – три оси (x , y, z). В каждой точке этого 3д пространства у loss есть какое-то значение, если продолжать аналогию со слепым на ландшафте, то это значение – ощущение слепого крутизны склона. 2 параметра дали бы 2д плоскость, а третьей осью мог бы стать loss (что часто используется, т.к. просто для отрисовки). Мой пример сложнее для отрисовки, но для метафоры со слепым человеком абсолютно нормальный и понятный. Считаю, что в текстовом формате такой пример проще для понимания.
Статья объясняет не почему, а как работают нейросети и предназначена для ознакомления людям, который только погружаются в эту тему или просто для общего понимания
Игровой ИИ тоже обучается, просто делает он это в момент разработки игры
Этим предложением вы однозначно говорите, что у животных нет никакого интеллекта, но ведь это не так. Уже давно ученые доказали, что многие виды животных способны обучаться, использовать орудия труда, запоминать события и обладать социальной структурой. По этому они тоже обладают интеллектом.
Только что вы сказали, что животные не имеют никакого интеллекта, а потом сравниваете интеллект человека и животных. А еще недавно вы говори, что умение решать сложные задачи и является интеллектом, а здесь говорите что человек обладает интеллектом, даже если не умеет решать сложных задач.
Вы сами себе противоречите, пожалуйста, закончите эту дискуссию
Прошу заметить, что помимо определения интеллекта, в статье упоминался ключевой фактор искусственного интеллекта – обучаемость.
Именно по этому мое определение не попадает под простую программу приборов
Я рассказал про 4 основные разновидности ИИ, а эволюционные вычисления относятся к эмерджентному подходу.
Эволюционные вычисления относятся к эмерджентному подходу, так как:
У них нету базы знаний, система сама находит путь к цели
Сложное поведение выстраивается из простых элементов
Правда сейчас, все более часто вижу, как люди выносят категорию «Вычислительный интеллект» (Computational Intelligence), куда включают:
Нейронные сети.
Эволюционные вычисления.
Нечеткую логику.
и там эволюционные вычисления считаются за отдельную разновидность, но лично я считаю их подвидом эмерджентного подхода
Постараюсь в ближайшее время написать еще несколько статей в которых более подробно будут разбираться отдельные категории ИИ, их подвиды, приемущества и недостатки
Как я написал в самой статье, понятие интеллекта может быть интерпритировано по разному, особенно в зависимости от контекста, и вообще этот вопрос можно назвать филосовским. То определение которое привели вы, абсолютно верно. Однако мое тоже отражает основную суть интеллекта и больше подходит под то, что в современном мире называют ИИ. Вы сами заметили, что исходя из вашего определения, ничего из ныне существующих технических решений нельзя назвать интеллектом, по этому в сфере ИИ это определние на данном моменте развития технологий можно упростить.
По поводу определения знаний, я соглашусь, что человек может получать их не только из коммуникации, но еще и из взаимодействия с внешним миром. Возможно об этом стоило упоминуть в статье, но в контексте технических систем эта недосказанность не имеет никакого смысла, потому что ИИ не может получать знания из взаимодействия с внешним миром, он может получать знания только из коммуникации с людьми и другими системами.
и по поводу этого
Подпись будет действовать только в паре с этим эфемерным ключем, что не даст его подменить. А публичный эфемерный ключ работает только в паре с приватным, из-за чего "человек посередине" (не зная приватного ключа) не сможет им воспользоваться для создания соединения с клиентом. Подпись служит защитой от подмены ключа
При разрыве соединения будет создано новое и счетчик обнулится, из-за чего багов быть не должно
По поводу установки долгоживущего соединения, идея не плохая, но механизм возобновления сессии будет надежнее, при этом особо не влияя на производительность.
Не помню или упоминал в статье, но я хочу сделать чтобы старые клиенты (которые по какой-либо причине не могут получить обновление) могли продолжать работу с обновленными серверами. И если зашивать ключ в бинарник, то без обновления клиента ключ становится статичным, что не безопасно.
Если публичный ключ будет известен клиенту, то приватный можно будет подобрать. Да, шанс подобрать приватный ключ не велик, однако никогда не равен нулю
В начале тоже не понимал в чем вообще смысл этого "Лишнего шага", пока писал свой протокол как раз и разабрался в этом.
Суть в том, что S - результат заранее известной математической операции, по этому оно может иметь предсказуему структуру, иметь какой-то паттерн. Например, каждый второй бит S обязательно 0 (пример взят из воздуха). Из-за чего криптоанализ упрощается и надежность падает. Деревация ключа делает его чуть более непредсказуемым.
А еще S может быть просто слишком длинным или слишком коротким для использования в качестве ключа шифрования, деревация помогает привести его к нужной длине используя весь ключ (а не просто отсечь лишние байты, или заполнить недостающие нулями)
Да, не изобретать велосипед в криптографии, как и в большенстве других отраслей, справедливо для продакшн‑систем. Но пет‑проекты как раз и нужны для того, чтобы экспериментировать. Я не пытался создать промышленный стандарт, этот проект был способом глубже разобраться в теме и поделиться опытом.
Спасибо за размернутый фидбэк и советы.
Как сказано в начале статьи этот протокол в первую очередь пишется для месенджера, где будет создаваться долгоживущее соединение и все данные будут перегоняться через него.
Идея кодирования API ручки в номере порта довольно интересная и поможет сэкономить байты в UDP пакете, но поскольку в моем сценарии предполагается долгоживущее соединение, использование одного порта для всей сессии будет более выгодным и простым в менеджменте. Однако, этот подход можно добавить в виде опциональной возможности, которая будет выгодна сервисам, создающим единичные, короткие get запросы. Не знаю на сколько целесообразно смешивать два подхода в рамках одного протокола и это внесет сложность в реализацию, по этому на данный момент реализовывать эту возможность я не стану, но обязательно подумаю над этим позже.
Оптимизация раундтипов хорошая возможность для улучшения. Это очень важно для скорости запуска и бесшовных переподключений, но внедрение нулевого раундтипа приведет к сложностям в виде защиты от reply атак, что может быть критично. К тому же я описывал механизм востановления сессии, который не успел реализовать, который должен значительно сократить время повторного подключения. И действительно нужен ли нулевой раундтип в добавку к механизму возобновления сессии нужно будет проверять эксперементально, после его реализации. В первой версии протокола я оставлю текущую схему, но если эксперемент покажет критические зависания связанные с 1-RTT, придется его оптимизировать.
А запекание ephemeral ключа приведет к проблемам с PFS, а в данном случае для меня безопасность приоритетнее скорости