• Как решить старую задачу с помощью ML на Python и .Net

    • Tutorial


    Бывает, что некоторые задачи преследуют тебя много лет. Для меня такой задачей стала склейка предложений текстов, в которых жестко забит переход на новую строку, а часто еще и перенос слов. На практике, это извлеченный из PDF или с помощью OCR текст. Часто можно было встретить такие тексты на сайтах он-лайн библиотек, в архивах старых документов, которые редактировались еще DOS-редакторами. И такое форматирование очень мешает затем правильной разбивке на предложения (а с переносами — и на токены) для последующей NLP-обработки. Да и банально показать такой документ в поисковой выдаче — будет некрасиво.


    Решал я эту задачу несколько раз — на Delphi, C#. Тогда это был жесткий алгоритм, где руками прописывал, например, какая может быть ширина текста, чтобы этот текст считался отформатированным "по-старому". Не всегда это срабатывало идеально, но в общем, хватало.

    Читать дальше →
  • Запланированные новые возможности C# 8.0

    • Translation


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


    Этот подход был преднамеренным, и он остается в силе.


    Более серьезные изменения, которые требуют большей работы на всех этапах разработки (проектировании, внедрении и тестировании), по-прежнему будут выпускаться только с основными релизами языка. И хотя окончательная минорная версия C# 7 еще не выпущена, команда уже активно работает над следующей основной версией языка: C# 8.0.


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

    Читать дальше →
  • Добро пожаловать в эру глубокой нейроэволюции

    • Translation
    image

    От имени команды Uber AI Labs, которая также включает Joel Lehman, Jay Chen, Edoardo Conti, Vashisht Madhavan, Felipe Petroski Such и Xingwen Zhang.

    В области обучения глубоких нейронных сетей (DNN) с большим количеством слоев и миллионами соединений, для тренировки, как правило, применяется стохастический градиентный спуск (SGD). Многие полагают, что способность SGD эффективно вычислять градиенты является исключительной особенностью. Однако мы публикуем набор из пяти статей в поддержку нейроэволюции, когда нейронные сети оптимизируются с помощью эволюционных алгоритмов. Данный метод также является эффективным при обучении глубоких нейронных сетей для задач обучения с подкреплением (RL). Uber имеет множество областей, где машинное обучение может улучшить его работу, а разработка широкого спектра мощных подходов к обучению (включая нейроэволюцию), поможет разработать более безопасные и надежные транспортные решения.
    Читать дальше →
    • +29
    • 16.9k
    • 3
  • Генерация программы из описания на естественном языке


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

      Авторы исследования тренировали RNN-сеть, используя базу с короткими программами, которые писались студентами и были определены как валидные (путем запуска системой проверки заданий). Описания заданий были сокращены до такого: «найти максимальное и следующее за ним по величине число».

      В результате был сгенерирован следующий код (стиль отступов и пунктуация «автора» сохранены без изменений):
      Читать дальше →
    • C# — есть ли что-то лишнее?

        Все будет быстро. Это выступление Анатолия Левенчука, в последнее время не дает мне покоя. Успехи глубинного обучения в последний год говорят о том, что все очень быстро изменится. Слишком долго кричали волки-волки говорили «искусственный интеллект», а его все не было. И вот, когда он, наконец, приходит к нам, многие люди этого просто не осознают, думая, что все закончится очередной победой компьютера в очередной интеллектуальной игре. Очень многие люди, если не все человечество, окажется за бортом прогресса. И этот процесс уже запущен. Думаю, что в этот момент меня не очень будет интересовать вопрос, который вынесен в заголовок статьи. Но, пока этот момент еще не настал, попытаюсь поднять этот потенциально спорный вопрос.

        Программируя уже более 25 лет, застал достаточно много различных концепций, что-то смог попробовать, еще больше не успел. Сейчас с интересом наблюдаю за языком Go, который можно отнести к продолжателям “линейки языков Вирта” — Algol-Pascal-Modula-Oberon. Одним из замечательных свойств этой цепочки является то, что каждый последующий язык становится проще предыдущего, но не менее мощным и выразительным.

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

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


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

        Поводом для данной статьи стал следующий пост: «Конвертация bmp изображения в матрицу и обратно для дальнейшей обработки». В свое время, мне немало пришлось написать исследовательского кода на C#, который реализовывал различные алгоритмы сжатия, обработки. То, что код исследовательский, я упомянул не случайно. У этого кода своеобразные требования. С одной стороны, оптимизация не очень важна – ведь важно проверить идею. Хотя и хочется, чтобы эта проверка не растягивалась на часы и дни (когда идет запуск с различными параметрами, либо обрабатывается большой корпус тестовых изображений). Примененный в вышеупомянутом посте способ обращения к яркостям пикселов bmp.GetPixel(x, y) – это то, с чего начинался мой первый проект. Это самый медленный, хотя и простой способ. Стоит ли тут заморачиваться? Давайте, замерим.

        Использовать будем классический Bitmap (System.Drawing.Bitmap). Данный класс удобен тем, что скрывает от нас детали кодирования растровых форматов – как правило, они нас и не интересуют. При этом поддерживаются все распространенные форматы, типа BMP, GIF, JPEG, PNG.
        Читать дальше →