14 subscribers
38 photos
3 files
18 links
Download Telegram
#hw lesson 8
Math
# Описать функцию fact2( n ), вычисляющую двойной факториал :n!! =
# 1·3·5·...·n, если n — нечетное; n!! = 2·4·6·...·n, если n — четное (n > 0 —
# параметр целого типа. С помощью этой функции найти двойные
# факториалы пяти данных целых чисел [01-11.2-Proc35]
def fact2(n):
if n < 3:
return n
return reduce(lambda x, a: a * x, [num for num in range(2 - (n & 1), n + 1, 2)])


# Даны три слова. Выяснить, является ли хоть одно из них палиндромом
# ("перевертышем"), т. е. таким, которое читается одинаково слева направо и
# справа налево. (Определить функцию, позволяющую распознавать слова
# палиндромы.)[03-10.32] (просто реализовал функцию палиндром)
def is_palindrome(word: str) -> bool:
if len(word) < 1:
return False
if word == word[::-1]:
return True
return False


# Описать функцию Sin1( x , ε ) вещественного типа (параметры x , ε —
# вещественные, ε > 0), находящую приближенное значение функции sin( x ):
# sin( x ) = x – x ^3 /(3!) + x^ 5 /(5!) – ... + (–1) ^ n · x^( 2·n+1) /((2· n +1)!) + ... .
# В сумме учитывать все слагаемые, модуль которых больше ε . С помощью
# Sin1 найти приближенное значение синуса для данного x при шести данных
# ε . [01-11.3-Proc41]

def sin1(x, epsilon):
s = x
n = 1
fact_collector = 1
while True:
fact_collector = fact_collector * (2 * n) * (2 * n + 1)
# сначала написал -1 ** 2, но в python - перед единицей это унарный оператор
# и соответственно степень имеет высший приоритет -_-
symb = (-1) ** n
num_path = (x ** (2 * n + 1))
temp_s = symb * num_path / fact_collector
if abs(temp_s) < epsilon:
break
s += temp_s
n += 1

return s


Тесты


@pytest.mark.parametrize(
"enter_value, expected_value",
[
(1, 1),
(0, 0),
(9, 945),
(6, 48),
]
)
def test_fact2(enter_value, expected_value):
assert fact2(enter_value) == pytest.approx(expected_value)


# Здесь предполагается, что функция Sin1 уже определена

@pytest.mark.parametrize(
"enter_value, expected_value",
[
('sor', False),
('', False),
('sos', True),
('poop', True),
]
)
def test_is_palindrome(enter_value, expected_value):
assert is_palindrome(enter_value) == pytest.approx(expected_value)


@pytest.mark.parametrize(
"x, epsilon, expected_approx",
[
(0, 0.1, 0), # sin(0) = 0
(math.pi / 6, 0.01, 0.5), # sin(π/6) ≈ 0.5
(math.pi / 4, 0.01, math.sqrt(2) / 2), # sin(π/4) ≈ √2/2
(math.pi / 2, 0.01, 1), # sin(π/2) = 1
(math.pi, 0.01, 0), # sin(π) = 0
(3 * math.pi / 2, 0.01, -1), # sin(3π/2) = -1
(2 * math.pi, 0.01, 0), # sin(2π) = 0
# Добавьте дополнительные тестовые случаи по вашему выбору
]
)
def test_sin1(x, epsilon, expected_approx):
assert sin1(x, epsilon) == pytest.approx(expected_approx, rel=epsilon)
This media is not supported in your browser
VIEW IN TELEGRAM
#cv Сверточные нейронные сети СНС (Convolutional Neural Networks CNN)

Facebook автоматом проставляет теги, google - поиск среди фото юзера, амазон генерирует рекомендации товаров, pintrest и instagram для поиска.

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

Что конкретно делают СНС? Берётся изображение, пропускается через серию свёрточных, нелинейных слоев, слоев объединения и полносвязных слоёв, и генерируется вывод.

Для нас картинка это разные цвета из которых мы формируем образы, машина видит это как матрицу из чисел.
Вводное изображение — это матрица 32 х 32 х 3 (32 на 32 квадрат из чисел, а x 3 это RGB, то есть в каждом числе находятся 3 показателя цвета)
#cv Первый cлой — математическая часть.

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

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

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

Выход для I фильра - карта свойств.
#cv На прикрепленном рисунке видны примеры фактических визуализаций фильтров первого свёрточного слоя обученной сети.

#value изображения выше — из Стэнфордского курса 231N, который преподают Андрей Карпатый и Джастин Джонсон (Andrej Karpathy and Justin Johnson).
#cv Классическая архитектура СНС
Input: Входные данные (например, изображения).

Conv: Сверточный слой, свертка(convolution) - извлекающий признаки (features) с помощью фильтров.

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


Pool: Слой подвыборки, уменьшающий размерность данных (например, Max Pooling). Это помогает уменьшить вычислительные затраты и контролировать переобучение.

Fully Connected: Полносвязный слой, соединяющий все нейроны предыдущего слоя для окончательной классификации.
#cv Полносвязные слои

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

# грубая вызуализация n пространственого вектора 
---> (0.2)
/
(0.8) ---> (0.5)
\
---> (0.3)

Выходом является n пространственный вектор (суперсложный термин, грубо говоря можно представить несколько векторов исходящих из одной точки, (входных даных), а на концах возможные классы по типу птицы, собаки, рыбы и тд). Каждый вектор в результате несет проценты вероятность исхода на этом векторе. Есть хвост (птица, рыба, собака выше процент), есть ноги(выше птица и собака), есть крылья(выше птица).
#cv Каждый сверточный слой извлекает более сложные черты изображения; чем глубже слой в сети, тем шире его область восприятия, способная обрабатывать информацию с большей области изображения. Фильтры в конце сети могут активироваться на более абстрактных объектах, например, рукописном тексте или розовых предметах.
This media is not supported in your browser
VIEW IN TELEGRAM
#cv Обучение нейросети

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

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

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

Его можно разделить на 4 блока:
- прямое распространение
- функцию потери
- обратное распространение
- обновление веса
.py
прямое распространение
#cv Прямое распространение

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

(значения n-вектора) не дается предпочтения определенному числу

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

Допустим, первое обучающее изображение — это цифра 3.
Ярлыком изображения будет
[0 0 0 1 0 0 0 0 0 0]

Функция потери может быть выражена по-разному, но часто используется СКО (среднеквадратическая ошибка):
1/2 умножить на (реальность — предсказание) в квадрате
.py
По сути прототип зрительной коры мозга.
#cv Реакция нейронов зрительной коры человека на разные типы линий

на видео показано, что в нашем мозгу конкретные нейроны активируются при просмотре линий определенного типа

https://www.youtube.com/watch?v=Cw5PKV9Rj3o&ab_channel=GIVN2SIN
.py
функцию потери
#cv функция потери

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

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

Веса нейронной сети (очевидно их больше, чем 2, но тут пример упрощен) это независимые переменные, а зависимая переменная — это потеря. Задача снизить потерю. Нам нужно приблизиться к самой нижней точке чашеподобного объекта. Для этого требуется найти производную потери (в данном графике — рассчитать угловой коэффициент в каждом направлении) с учётом весов).
Это эквивалент dL/dW, где W — веса определенного слоя.
#ml Основы. Методы обучения нейронных сетей.

1. Обучение с учителем (supervised learning) - при обучении нейронная сеть получает данные и их значение. Чтобы описать содержимое датасета, его просматривают вручную и размечают. Это делает человек или группа — тот самый условный учитель.

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

2. Обучение без учителя (unsupervised learning) - нейронная сеть получает на вход неразмеченные данные и старается сама найти в них общие признаки и закономерности.

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

Используются для:
- Кластерного анализа (разделение больших массивов данных на группы)
- Выявления аномалий (например, обучение нейронной сети сначала на "нормальных" данных, чтобы она могла обнаруживать выбросы при работе)
- Нахождения ассоциаций (определение критериев сходства между объектами и установление связей)

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

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

Используется для:
- Обучения машин механическим манипуляциям
- Управления транспортом
- Работы в техподдержке

Минусы:
Требуется очень много времени.
Необходимо множество реальных примеров.
#ml Основы. Выборка.

Обучающая выборка - данные для разработки модели

«Валидационная выборка» — данные для подбора оптимального набора гиперпараметров.

«Тестовая выборка» — данные позволяещие протестировать модель и являющиеся контрольным.
#ml Метрики моделей. Accuracy

отвечает на вопрос: как часто модель делает правильное предположение.

Accuracy = correct predictions/ all predictions



Проблема accuracy в случаях, где метки класса будут выявляться редко, например на рентген снимках. Представим что из выборки 100 снимков только 3 будут раковыми. Если обучить модель так, чтобы она рандомно ставила 97 процентов снимков без рака, тогда даже если она пропустила все 3 раковых снимка ее accuracy будет 0.97

accuracy - полезная метрика, когда вы имеете дело со сбалансированными классами и заботитесь об общей "правильности" модели, а не о способности предсказывать конкретный класс.

Accuracy легко объяснить и передать.

Если у вас есть несбалансированные классы, accuracy менее полезна, поскольку она придает равный вес способности модели предсказывать все категории. Сообщение о точности в таких случаях может ввести в заблуждение и скрыть низкую производительность для целевого класса.
#ml Используя confusion matrix, можно представить все 4 варианта исхода предположений в одной таблице.

Истинные позитивные TP (спам который модель обозначила спамом)

Ложные позитивные FP (письма не являющиеся спамом, но обозначенные моделью как спам)

Ложные негативные FN (спам принятый моделью за обычные письма)

Истинные негативные TN (обычные письма обозначенные обычными письмами)
#ml Метрики моделей. Precision (en точность) - отношение позитивных предсказаний модели к общему число позитивных предсказаний.

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

Плюсы:

- хорошо подходит для задач с несбалансированными классами (показывает правильность определения целевого класса моделью. )

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

Минусы:
- Точность не учитывает ложноотрицательные результаты (не учитывает случаи, когда мы пропускаем целевое событие)
#ml Метрики моделей. Recall

отношение позитивных пресказаний TP к общему количеству таргет класса в датасете. Recall отвечает на вопрос: может ли модель найти все экземпляры искомого класса.

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

минусы обратны precision:
- не берет во внимание ложные позитивные FP

recall фокусируется на том чтобы модель нашла все вхождения целевого класса, не обращая внимания на то сколько классов будет помечено как целевой неправильно.
#ml Метрики моделей. F1 score.

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

Чем выше значение F1-меры, тем лучше модель справляется с балансированием точности и полноты в своих предсказаниях.
#ml Краткая история нейросетей. Part I.

В 1943 году в своей статье «Логическое исчисление идей, относящихся к нервной активности» Уоррен Мак-Каллок и Уолтер Питтс предложили понятие искусственной нейронной сети.

В 1957 году в Корнеллской лаборатории аэронавтики было успешно завершено моделирование работы перцептрона на компьютере IBM 704, а два года спустя, 23 июня 1960 года, в Корнеллском университете был продемонстрирован первый нейрокомпьютер — «Марк-1», который был способен распознавать некоторые буквы английского алфавита.

Перцептрон обучали с помощью метода коррекции ошибок.

В свое время из-за нехватки вычислительных мощностей сдал позиции.
#ml Краткая история нейросетей. Part II.

Уже ближе к концу 20-го века исследователи добились большого прогресса. Был разработан "Метод обратного распространения ошибки".

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

В дополнение к Методу исследователи придумали нелинейные функции активации. Они позволяют сети моделировать сложные взаимосвязи между входами и выходами.
This media is not supported in your browser
VIEW IN TELEGRAM
#ml Краткая история нейросетей. Part III.

В "нулевых" появились мощные графические процессоры и стали доступны большие объёмы данных, что привело к разработке алгоритмов Deep Learning. Результаты исследований начали демонстрировать высокие результаты в обучении и составлении прогнозов на основе больших объёмов данных.

Одной из самых прорывных историй является создание модели GPT-3 (Generative Pretrained Transformer 3) — языковой модели, разработанной OpenAI (они и создали ChatGPT). Модель была представлена в 2020 году и хорошо нашумела. Её натренировали на огромном количестве текстовых данных и научили выполнять разные языковые задачи.

В конце ноября 2022-го года в свет выходит ChatGPT и спустя 2 месяца пробивает отметку в 100 миллионов пользователей, получив статус самого быстрорастущего онлайн-сервиса за всю историю.