340 likes | 528 Views
Использование нейронных сетей для решения обратной задачи Магнитотеллурического Зондирования. Гужва А.Г. Обратная задача Магнитотеллурического Зондирования. Обратная задача: восстановление реальных характеристик пород по наблюдаемым ЭМ полям. ?. ?. ?. ?.
E N D
Использование нейронных сетей для решения обратной задачи Магнитотеллурического Зондирования Гужва А.Г.
Обратная задача Магнитотеллурического Зондирования • Обратная задача: восстановление реальных характеристик пород по наблюдаемым ЭМ полям ? ? ? ?
Задача Магнитотеллурического зондирования (МТЗ) • Обратная задача МТЗ( ->): Ak=, ГкRNk, RMk • Ak – заданный дискретный оператор прямой задачи • =(1… Mk) – вектор характеристик МТ поля, измеренных на поверхности Земли • =(1… Nk) – вектор макропараметров среды • Гk– область допустимых значений • k – класс разрезов
Задача Магнитотеллурического зондирования (МТЗ) • Обратная задача МТЗ( ->): Ak=, ГкRNk, RMk • Система нелинейных уравнений относительно • Неустойчива и некорректна • Вид уравнений • Размерность данных • Чудовищная размерность данных
Задача Магнитотеллурического зондирования (МТЗ) • Прямая задача МТЗ( -> ): Ak=, ГкRNk, RMk • Устойчива и корректна • Считается на суперкомпьютерах • Эталонная база решений прямой задачи: • Задаем 1, считаем 1=Ak1, знаем (1, 1) • … • Задаем N, считаем N=AkN, знаем (N, N)
Задача Магнитотеллурического зондирования (МТЗ) • Приближенное решение обратной задачи • * appr(1 … N, a1,…,aJ) • ai – неопределенные коэффициенты • appr– заданная функция некоторого вида • Решение задачи нелинейной регрессии на эталонной базе решений прямой задачи • Полученное решение есть приближенный обратный оператор задачи
Задача Магнитотеллурического зондирования (МТЗ), 2D Воздух: =0 0 км • 336 блоков () • Электропроводность • 10-4< <1См/м • 6552 входных признака () • 4 компоненты • Пространственная сетка – 126 • Частотная сетка – 13 • 30000 эталонных примероврешения прямой задачи • Интересующая область : до 5 км 5 км 10 км 17 км 30 км 100 км. • Решение задач нелинейной регрессиидля каждого блока по-отдельности • Итого: 336 задач нелинейной регрессии
Задача нелинейной регрессииДано: • Задан конечный обучающий набор векторов X={x1…xn}, xi RM, i = 1..n • Имеется зависимость y=y*(x), y*: RM → RP, для которой известны yi = y*(xi) для xi X • Задано разбиение Xна тренировочный набор данных XTrnи тестовый набор данных XTst • Задан вид семейства нелинейных параметрических функций M переменных y=f(x,)
Задача нелинейной регрессииТребуется: • Аппроксимация y* с помощью f(x, ) • Найти решение системы уравненийпо y*(x1)=f(x1,) … y*(xm)=f(xm,) при котором достигался бы минимум функционала ошибки: E(, XTst)=xXTst(y*(x)-f(x,))2 , xi XTrn
Нейронные сети. Многослойные персептроны • МСП - семейство параметрических вектор-функций • МСП с 1 скрытым слоем (f: RM → RP) • () С1 – ограниченная монотонно возрастающая действительная функция • и u – матрицы весов (N x (M + 1) и P x (N + 1)) • k = 1..P • N – характеризует сложность конструкции
Традиционный способ решения задачи нелинейной регрессиидля многослойных персептронов (обучение сети) • Оптимизационная задача по подбору элементов матриц весов • Решение методом наименьших квадратов путем минимизации функционала ошибки: E(,XTrn)=xXTrn(y*(x)-f(x,))2→min E(, XTst) используется для контроля останова процесса обучения нейронной сети Например, используется градиентный спуск
Задача МТЗ. • 1 большая обратная задача МТЗ • «В лоб» не решается • Размерность входного вектора 6552 • Размерность выходного вектора 336 • 6780 небольших задач нелинейной регрессии • Размерность входного вектора 1648 • Размерность выходного вектора 1
Задача МТЗ. Формально. • Решение ~7000 задач нелинейной регрессии • Вид аппроксимирующей функции y(x, u, ): где u, – матрицы неопределенных коэффициентов • Для всех задач нелинейной регрессии входной набор данных одинаков • Размерность вектора входных данных x = 1648 • Выходные наборы данных уникальны • Размерность вектора выходных данных y =1
Задача МТЗ. Формально. • 30000 примеров эталонной базы решений • Решение задачи нелинейной регрессии (подбор u, ) • Минимизация функционала ошибки вида где W = {u, } – условное обозначение матриц весовмногослойного персептрона y(x, W) Например, использование метода градиентного спуска
CPU. Градиентный спуск Минимизация функционала ошибки вида Размерность W ~ 104 Градиентный спуск: • W=W0 • W=W - *grad E(W), где ~10-1–10-3 • goto 2 Распараллеливается на MPI
CPU • 6780 небольших задач нелинейной регрессии • 5 AMD Athlon 64 x2 Dual 6000+ 3.0 GHz • 1 ядро того же уровня • Итого 11 ядер • Вычисления во float-ах • Своя спец. библиотека • Итого - 2 месяца вычислений • С перерывами на выходные
CUDA. Распараллеливание • Нет • Убыстрение 1 вычисления y(x, u, ), y/u, y/ • Да! • Параллельное вычисление • y(x1, u, ), …, y(xN, u, ) • Параллельное решение нескольких задач нелинейной регрессии • y(x, u1, 1), …, y(x, uM, M) • y(x1, u1, 1), …, y(xN, uM, M)
CUDA. Реализация • Функционал ошибки • E(W) = i=1,N (y(xi,W) - yi)2 • grad E(W) = 2 * i=1,N (y(xi,W)-yi) * y/W(xi) • Одновременное решение нескольких задач нелинейной регрессии • grad E1(W1) = 2 * i=1,N (y(xi,W1)-yi) * y/W|1(xi) ……… ……… ………. • grad Ek(Wk) = 2 * i=1,N (y(xi,Wk)-yi) * y/W|k(xi)
CUDA. Реализация • Использование CUBLAS для вычисления значений функции (cublasSgemm) ………… ……… • Аналогично с производными
CUDA.Реализация • Эффект за счет резкого уменьшения числа операций работы с памятью • Необходимость переноса больших объемов данных между узлами • CUDA: наличие shared memory • Основное время при проектировании • Расположение данных в памяти • Код спроектирован с нуля • Вычисления во float-ах • Вид аппроксимационной функции
Результаты • CPU: AMD Athlon 64 x2 Dual 6000+ 3.0 GHz • В GPU-реализации неиспользуется Zero copy memory
GPU • 6780 небольших задач нелинейной регрессии • 1 Tesla C2050 • 256 параллельно решаемых задач нелинейной регрессии • Итого: ~13 часов • На разогнанном GTX 580 ~ 6 часов(ориентировочно)
«Грабли». Учитывать при проектировании • Доступные ресурсы для ядра • Регистры, shared memory, потоки • RTFM: Zero copy, pinned memory, … • А также прочие полезные «фичи» • Bottleneck для этой задачи • Пропускная способность внутренней шины данных (~100 GB/s)
«Грабли». Раскрытие циклов //// Ядро с циклом __global__ void kernel(intN) { ... for (inti = 0; i < N; i++)//// Цикл ...//// Тело цикла ... } //// Этот код быстрее! template<intN> __global__ void kernel() { ... for (inti = 0; i < N; i++) //// Цикл ...//// Тело цикла ... } • N – заранее известно • N может принимать огр. число значений
«Грабли». Использование CUDA Primitives • CUDA parallel primitives • Reduction • Scan • И т.д. • В виде отдельных процедур • CUDPP • Внедрить в собственное ядро!
«Грабли». Если глючит, то… • nvidia-smi • cuda-memcheck • Проверять cudaGetLastError(); • В код повставлятьcudaThreadSynchronize(); • Выделение shared памяти __global__ void kernel() { __shared__ float klmn[100];//// в klmn– не нули!!!!!! ... }
«Грабли». Если глючит, то… • Воспроизводимостьглюка • Запуск процесса в цикле • Каждый раз сравнение результатов, в т.ч. промежуточных массивов данных • Компилятор nvcc • RTFM, форумы, коллеги
«Грабли». Если глючит, то… • Если ничего не помогло, то…
Распараллеливание • Вычисление функции y(x, a) • Варианты действий: • Распараллеливание y(x, a) • Одновременно y(x1, a), …, y(xN, a) • Одновременно y(x, a1), …, y(x, aM) • Одновременно y(x1, a1), …, y(xN, aM)