Привет из ада!

Это четвёртый выпуск журнала «Хиккинги».

Сегодня в номере:



Что нами движет?

Вам случалось любоваться Матрицей, её гениальностью?.. Миллиарды людей живут полноценной жизнью… во сне. (агент Смит, фильм “Матрица”)

- Всё это нереально?

- Что есть реальность? И как определить ее? Весь набор ощущений: зрительных, осязательных, обонятельных — это сигналы рецепторов, электрические импульсы, воспринятые мозгом.

(Нео и Морфеус, фильм “Матрица”)

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

Человеческий мозг является сетью из более чем 85 миллиардов нейронов, а число соединений между ними стремится к поистине громадным числам. (Для сравнения: полностью исследованный коннектом дождевого червя, нервная система которого состоит из 300 нейронов, насчитывает 7000 соединений между нейронами.) Образование и изменение связей между нейронами обусловлено: 1) ДНК - генетическим кодом, полученным в результате слияния генетического кода родителей; 2) нервной деятельностью - воспитание, жизненный опыт, переживания: да, даже простая простая мысль может изменить структуру соединений между нейронами.

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

Электрические импульсы в мозге передаются химически - с помощью особых веществ - нейромедиаторов. От их количественного изменения - переизбытка или недостатка определённых нейромедиаторов - зависит состояние психики человека, т.е. процесс высшей нервной деятельности - сознание, ощущения, восприятие, память, мышление, намерения и т.п. Именно этим обуславливается эффект от кофе, шоколада, алкоголя, наркотиков: преодолевая защитную систему мозга (гемато-энцефалический барьер) психоактивные вещества из кровеносной системы попадают в мозг и воздействуют на количество нейромедиаторов в нейронах, что приводит к тому, что мозг в целом начинает работать по-другому, потому что фактически меняются синаптические веса нейронов, т.е. вероятности прохождения различными путями электрохимического сигнала от одних нейронов к другим. Например, алкоголь приводит к смещению баланса самых важных нейромедиаторов и их рецепторов (нейронов, восприимчивых к конкретным типам нейромедиаторов): дофамина (“система поощрения”; изменение высших когнитивных функций: реакции, внимания), серотонина (усиление передачи сигнала между нейронами; усиление восприимчивости серотониновых рецепторов, что приводит к ощущению удовольствия и опьяняющих эффектов), ГАМК (приводит к торможению нервной системы). Употребление ЛСД, который представляет собой молекулу, близкую по структуре к серотонину, приводит к переизбытку серотонина, что увеличивает «влияние» вторичных сигналов в мозге, и возникают галлюцинации.

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

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

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

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

Контролируем ли мы своё поведение? Контролируем ли мы своё восприятие? Контролируем ли мы своё будущее?

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

- У меня нет выбора. Все предопределено. Даже мои ответы.

- А ты лишь переживаешь череду движений? Самое сильное создание во вселенной - на самом деле лишь марионетка.

- Мы все марионетки, Лори. Просто я вижу нити.

(Доктор Манхэттен и Лори Юпитер, фильм “Хранители”)

↑ к оглавлению


AutoML

В конце курса Intro to Machine Learning на Kaggle есть “бонусный” (скорее, маркетинговый) урок по использованию Google AutoML Tables. Google Cloud предлагает $300 и 3-месячную триалку для того, чтобы пощупать их облачную платформу. Google AutoML Tables - один из продуктов для автоматизации процесса создания и обучения модели: на вход подаётся датасет (предварительно заливаемый на Google Cloud Storage), указываются target-параметры, бюджет проекта (выраженный во времени работы нод; ~$20 в час за “92 n1-standard-4 equivalent machines in parallel”); на выходе получается модель, которую можно развернуть на мощностях Google Cloud (“$0.005 per GiB per hour per machine”), либо экспортировать в виде TensorFlow package для специального Docker-контейнера и развернуть на своих мощностях.

Подготовка

Для начала необходимо подключить $300 триалку, чтобы потренироваться бесплатно. Подробно об этом можно почитать на страничке, посвящённой бесплатному использованию продуктов Google Cloud. Создаётся проект (New project), привязываются billing-данные карточки, на счету оказывается $300 кредитов, в локальной валюте, для использования продуктов.

После создания проекта необходимо создать Cloud Storage для хранения датасетов (а также результатов batch predictions, самой экспортированной модели). Это делается с помощью функции Create bucket.

Создание модели

Для создания модели я использовал предлагаемый в курсе на Kaggle AutoML Tables Wrapper. Это обёртка над гугловыми библиотеками для работы с Google Cloud (storage, automl_v1beta1), которая 1) заливает на Google Cloud Storage csv-датасет для обучения, выставляет nullable-флаги у столбцов на основе входных данных, заливает тестовый датасет, для которого нужно получить predictions; 2) отправляет запрос на создание модели с указанием бюджета обучения, target-параметром; 3) скачивает результирующий csv.

Получить predictions у модели можно двумя способами: online и batch. Online - в случае, если запросы посылаются к REST-сервису развёрнутой в Google Cloud или у себя модели; batch - если подаётся большой csv/json/BigQuery кусок данных. Подробно о различиях можно прочитать в статье Online versus batch prediction. Для меня различие состояло прежде всего в том, что в случае batch predictions происходящее внутри трудно (невозможно?) отследить: predictions по отдельным строкам различались в batch и online-результатах; кроме того, в batch prediction results был файл с ошибками, из которых следовало, что некоторые не-nullable столбцы содержали null (хотя этот флаг во wrapper’е выставляется по объединению данных train- и test-датасетов). Причину этого вижу в своей криворукости либо в необходимости более тщательной очистки и подготовки и проверки метаданных перед обучением, либо в beta-статусе самой платформы AutoML Tables.

В случае возникновения ошибок при использовании wrapper’а рекомендую также иметь в виду тред на Kaggle: в силу определённых причин модель может работать только с датасетами, расположенных в bucket’ах того же региона (рекомендуется использовать us-central1).

В самом простом случае необходимо задать соответствующие переменные:

amw = AutoMLTablesWrapper(project_id=PROJECT_ID,
                          bucket_name=BUCKET_NAME,
                          dataset_display_name=DATASET_DISPLAY_NAME,
                          train_filepath=TRAIN_FILEPATH,
                          test_filepath=TEST_FILEPATH,
                          target_column=TARGET_COLUMN,
                          id_column=ID_COLUMN,
                          model_display_name=MODEL_DISPLAY_NAME,
                          train_budget=TRAIN_BUDGET)

Запустить обучение: amw.train_model() и получить результаты: amw.get_predictions()

Использование Google Cloud Console

В результате обучения (если всё прошло успешно) в Cloud Console в разделе AutoML Tables появляется обученная модель, по которой можно увидеть основные статистики и оценки ошибки предсказаний. Сначала необходимо развернуть (deploy) модель через контекстное меню (More options). После успешного завершения процесса (по умолчанию уведомления обо всех событиях в облаке будут прилетать в виде писем на гуглопочту), можно перейти к непосредственной работе с моделью (или же сразу экспортировать). Во вкладке Test & Use можно запустить Batch predictions, отправить запрос через форму во вкладке Online prediction, а также экспортировать модель в разделе Export your model.

Batch predictions выполняется по csv-файлу (предварительно его нужно залить в один из backet’ов в Cloud storage, но обязательно в том же регионе, где и развёрнута модель) или по результату запроса из BigQuery (здесь нужно отметить, что поля в csv могут иметь имена, например, начинающиеся с цифры, которые в BigQuery будут некорректными, т.о. они не сматчатся, и результат запроса нельзя будет импортировать в качестве входных данных для batch prediction, так что корректируйте все входные данные ДО обучения). Результат тоже выгружается либо в BigQuery, либо в Cloud storage bucket (в том же регионе); в результате будет файл с предсказаниями и файл с ошибками.

Можно сделать ручной запрос к развёрнутой модели на вкладке Online prediction, просто заполнив все поля в форме и нажав Predict.

Экспортирование и разворачивание модели

Модель можно экспортировать либо из контекстного меню у элемента списка в разделе AutoML Tables либо уже в свойствах самой модели в разделе Export your model. Чтобы скачать модель (или развернуть вручную), сначала нужно её экспортировать в один из backet’ов в Cloud storage, а потом, используя утилиту gsutil Google Cloud SDK скопировать файлы модели к себе. Нужно отметить, что приведённая на странице экспортирования команда gsutil cp -r gs://target/* ./download_dir не сработает, поскольку среди файлов, генерируемых при экспорте есть директории с символами, которые являются некорректными в Windows (по сути и в *nix-системах тоже, но там ошибка возникнет чуть позже, при запуске докер-контейнера). Поэтому лучше зайти в браузер Cloud Storage и там исследовать и выбрать нужные файлы (всё, что без спецсимволов типа $), а потом их скачать списком, например:

gsutil -m cp -r "gs://automl-exper-export/model-export/tbl/tf_saved_model-house_prices_model-2021-04-24T12:33:44.446633Z/assets.extra/" "gs://automl-exper-export/model-export/tbl/tf_saved_model-house_prices_model-2021-04-24T12:33:44.446633Z/assets/" "gs://automl-exper-export/model-export/tbl/tf_saved_model-house_prices_model-2021-04-24T12:33:44.446633Z/saved_model.pb" "gs://automl-exper-export/model-export/tbl/tf_saved_model-house_prices_model-2021-04-24T12:33:44.446633Z/variables/" ./houses

Перед использованием Google Cloud SDK необходимо выполнить gcloud init и следовать указаниям.

После ознакомления с руководством по экспорту модели Exporting models, можно создать и запустить докер-контейнер, указав местоположение файлов модели: docker run -v `pwd`/model-export/tbl/new_folder_name:/models/default/0000001 -p 8080:8080 -it gcr.io/cloud-automl-tables-public/model_server 

В результате на порту 8080 будет работать REST-сервер, которому можно отправлять запросы в формате JSON в объекте instances:

{
  "instances": [
    {
        "Id": 1461,
        "MSSubClass": 20,
        "MSZoning": "RH",
        "LotFrontage": 80
        // ...
        // other columns
     }
  ]
}

Пример отправки запроса через curl:

curl -X POST --data @request.json http://192.168.8.103:8080/predict

В ответе получает объект predictions:

{"predictions": 126945.6640625}

Из DataFrame можно сформировать JSON, например, следующим образом:

test = pd.read_csv("test.csv")
inputs_json = test.iloc[:,1:] // without first ID column
inputs_json.to_json("req_all.json")

и добавив “обёртку”:

{
  "instances": [
  // content of req_all.json file
  ]
}

Отправка запросов к Cloud AutoML API

Для программной отправки запросов к API (например, из python-библиотеки - к развёрнутой модели в Google Cloud) нужно подключить Cloud AutoML API в разделе APIs & Services и там же создать service account в подразделе Credentials, выставив role = Owner, скачать ключ во вкладке Keys у созданного аккаунта.

Чтобы google.cloud.automl_v1beta1 мог взаимодействовать в Cloud AutoML API нужно задать путь к скачанному ключу через переменную окружения GOOGLE_APPLICATION_CREDENTIALS. А также иметь под рукой те же параметры, которые задавали для AutoML Tables Wrapper.

В итоге, из Jupyter Notebook можно отправить запрос к развёрнутой в Google Cloud модели так:

%env GOOGLE_APPLICATION_CREDENTIALS d:\YOUR_SERVICE_KEY.json

project_id = 'YOUR_PROJECT_ID'
compute_region = 'us-central1'
model_display_name = 'YOUR_MODEL_NAME'

from google.cloud import automl_v1beta1 as automl

client = automl.TablesClient(project=project_id, region=compute_region)
response = client.predict(
   model_display_name=model_display_name, inputs=inputs
)

for result in response.payload:
    print(
        "Predicted value: {}".format(result.tables.value)
    )

Входные данные TablesClient ожидает в виде dict, поэтому нужно преобразовать из Series в нативные python-объекты. Я это сделал (возможно, это неправильно и некрасиво) так:

inputs_pre = test.iloc[0,1:] // one row for example, without first ID column
inputs = {}
for i, v in inputs_pre.items():
    if type(v) == str or type(v) == float:
        inputs[i] = v
    else:
        inputs[i] = v.item()

Резюме

Технология интересная, прикольная, но, полагаю, для серьёзных DS/ML-инженеров пока сыровата и довольно неконтролируема (слишком ограниченный и плохо документированный формат входных данных; экспорт модели только в виде очень тяжёлого и “закрытого” контейнера с привязанным REST-сервером). Ну, и (наверное) дороговато. Тем не менее, для каких-то простых задач всё сработает из коробки, были бы достаточные бюджеты; например, в результате часа обучения (это обошлось мне в бесплатные ~$20) полученная модель (без какого-либо тюнинга) перекинула меня в top 12% в учебном соревновании на классической Ames Housing dataset.

См. также:

↑ к оглавлению


Pagination

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

Типичная наивная реализация выборки из БД для постраничного вывода представляет собой конструкцию вида ORDER BY $id1, $id2... OFFSET ($pageNum-1)*$pageSize LIMIT $pageSize ($var здесь и далее - именованные аргументы запроса; это не про PHP).

  1. Поля, по которым будет выполнена сортировка (ORDER BY $id1, $id2...) для постраничного вывода должны быть проиндексированы (CREATE INDEX).

  2. Нужно отказаться от использоваться OFFSET. Проблема в том, что сначала выбираются ВСЕ записи из таблицы, а потом указанное в OFFSET число записей пропускается. Вместо OFFSET нужно использовать фильтрацию в WHERE, фильтруя записи по $id < $offset. Но что, если в id есть пропуски?

  3. Поэтому ещё нужно определиться с типом вывода: будет ли это бесконечный скролл или навигация по пронумерованному списку страниц. Бесконечный скролл - реализовать намного проще, и случай с пропусками имеет простое решение. Будем добавлять к запросу $current_id, с которого начинается отсчёт, т.е. будем отбирать те записи, у которых WHERE id > $current_id. Для первой страницы (начальный вывод бесконечного скролла) положим $current_id равным 0. Для того, чтобы определить, остались ли ещё записи, можно сравнивать количество уже загруженных и выведенных записей с общим количеством или в запросе делать LIMIT $pageSize+1, но выводить только $pageSize элементов и проверять, сколько элементов было фактически получено. 

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

Бонусная часть: бинарный поиск по id в таблице

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

Добавляем много записей в тестовую таблицу (с индексом id) и создаём искусственные пропуски.

INSERT INTO tests.fb(id)
SELECT 100000*d6.d+d5.d*10000+d4.d*1000+d3.d*100+d2.d*10+d1.d id
FROM
(SELECT 0 d UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) d1,
(SELECT 0 d UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) d2,
(SELECT 0 d UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) d3,
(SELECT 0 d UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) d4,
(SELECT 0 d UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) d5,
(SELECT 0 d UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) d6

DELETE FROM tests.fb WHERE id > 0 AND (MOD(id, 3) = 0 OR MOD(id, 5) = 0)

Создадим функцию, которая будет находить нужную страницу в БД бинарным поиском и возвращать стартовый id:

DROP FUNCTION IF EXISTS tests.BINID;
DELIMITER //
CREATE FUNCTION tests.BINID(pageNumber INT, pageSize INT) RETURNS INT DETERMINISTIC
BEGIN
    DECLARE L, R, M, CID INT DEFAULT 0;
    DECLARE REQCID INT DEFAULT 0;
    SET @REQCID = (pageNumber-1)*pageSize;
    SELECT id INTO @L FROM tests.fb ORDER BY id ASC LIMIT 1;
    SELECT id INTO @R FROM tests.fb ORDER BY id DESC LIMIT 1;
    WHILE @L < @R DO
        SET @M = (@L + @R) DIV 2;
        SELECT COUNT(id) INTO @CID FROM tests.fb WHERE id <= @M;
        IF @CID > @REQCID THEN SET @R = @M;
        ELSE SET @L = @M+1;
        END IF;
    END WHILE;
    RETURN @L;
END//
DELIMITER ;

Результаты:

SELECT id FROM tests.fb ORDER BY id ASC LIMIT 50 OFFSET 4950

50 row(s) returned 0.015 sec / 0.000 sec

SELECT id FROM tests.fb WHERE id >= tests.BINID(100, 50) ORDER BY id ASC LIMIT 50

50 row(s) returned 0.078 sec / 0.000 sec

SELECT id FROM tests.fb ORDER BY id ASC LIMIT 50 OFFSET 24950

50 row(s) returned 0.125 sec / 0.000 sec

SELECT id FROM tests.fb WHERE id >= tests.BINID(500, 50) ORDER BY id ASC LIMIT 50

50 row(s) returned 2.422 sec / 0.000 sec

10 миллионов строк:

SELECT id FROM tests.fb ORDER BY id ASC LIMIT 50 OFFSET 249950

50 row(s) returned 0.438 sec / 0.000 sec

SELECT id FROM tests.fb WHERE id >= tests.BINID(5000, 50) ORDER BY id ASC LIMIT 50

50 row(s) returned 26.422 sec / 0.000 sec

Источники вдохновения по теме: Pagination Optimization, Pagination Done the PostgreSQL Way.

↑ к оглавлению


YouTube DarkNet TV

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

YouTube DarkNet TV - это интернет-телеканал, редакторы и автоматизированные модули которого с помощью YouTube Data API отбирают самую мякотку Ютуба - видео и каналы с малым количеством просмотров и подписчиков, на которых запечатлены страннейшие видеоотрывки, личности, анимация.

YouTube DarkNet TV реализован в виде бэкенда с базой данных (gin-gonic + MySQL), куда собираются и где хранятся видео, редакторской панели и фронтенда с уникальным дизайном в виде старого обосранного телевизора, который управляется jQuery, и принимает сигналы от YouTube IFrame API.

Редакция с радостью принимает и обрабатывает присылаемые видео (кнопкой Add video).

Данный материал является рекламой сервиса YouTube DarkNet TV.

↑ к оглавлению


Гигиена ума

Часто гоняешь навязчивые мысли по кругу? Тревожишься без объективных причин? Ощущаешь внутреннюю пустоту и бессмысленность существования? Огрызаешься и презираешь окружающих, злишься на обстоятельства? Считаешь себя не достойным лучшего или наоборот - достойным лучшего, - но ничего не можешь изменить? Потерял вкус к жизни, страдаешь от одиночества? Или ещё что-то другое? Существует крутой и универсальный рецепт для восстановления психики, инструмент для гигиены ума, Святой Грааль для достижения состояния потока, круглосуточный доступ к божественному и духовному - и абсолютно бесплатно! Властьимущие тысячелетиями скрывали этот СЕКРЕТ, и вот, наконец, агенты психовойск свободного человечества планеты Земля, наконец, раскрыли его.

Это секретное оружее - МЕДИТАЦИЯ. И хотя наука пока не может дать ответ, как это всё работает, тем не менее проведено большое количество исследований, экспериментов, говорящих что это отлично работает при проблемах с психикой. Но медитации ещё и инструмент биохакера, и дают огромный бафф на здоровье - иммунитет, органы дыхания, сердечно-сосудистую систему, когнитивные функции, на механизмы старения, гомеостаз организма вообще (достаточно загуглить “meditation respiratory system”, “meditation immune system” и всё такое…).

При всех этих громадных плюсах этот инструмент - идеально подходит для очень ленивых и безвольных людей, т.к. максимально простой и естественный. Если в двух словах и по-простому: всё, что нужно сделать, - это найти 10 минут в своём забитом расписании, отключить уведомления и попросить окружающих тебя не беспокоить, сесть/лечь, закрыть глаза, расслабиться и следить за дыханием - осознавать (для начала - например, внутри себя проговаривать) “вдох” и “выдох”. Больше ничего - буквально.

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

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

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

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

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

Мотивирующие видео по теме: “Медитация осознанности: ясное мышление, покой, убрать негатив. Как научиться медитировать”, “Медитация для начинающих. Проще некуда.”, “10 минут чтобы стать счастливее”.

↑ к оглавлению


Дайджест интересностей

↑ к оглавлению


До следующего прихода! Живы будем - не помрём!