Использование нейронных сетей для решения обратной задачи Магнитотеллурического Зондирования Гужва А.Г. Обратная задача Магнитотеллурического Зондирования • Обратная задача: восстановление реальных характеристик пород по наблюдаемым ЭМ полям Задача Магнитотеллурического зондирования (МТЗ) • Обратная задача МТЗ ( -> ): 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 км 5 км 10 км 17 км Воздух: =0 • 336 блоков () • Электропроводность • 10-4< <1 См/м • 6552 входных признака () • 4 компоненты • Пространственная сетка – 126 • Частотная сетка – 13 • 30000 эталонных примеров решения прямой задачи 30 км 100 км. • Интересующая область : до 5 км • Решение задач нелинейной регрессии для каждого блока по-отдельности • Итого: 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, ) , xi XTrn при котором достигался бы минимум функционала ошибки: E(, XTst) = xXTst(y*(x) - f(x, ))2 Нейронные сети. Многослойные персептроны • МСП - семейство параметрических вектор-функций • МСП с 1 скрытым слоем (f: RM → RP) f x, , N , u, v u[i, k ] * v[ j, i] * x[ j ] v[0, i] u[0, k ] N k i 1 M j 1 – () С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, ): 8 1648 y x, u , v u[i, k ] * v[ j , i ] * x[ j ] v[0, i ] u[0, k ] i 1 j 1 где 1 1 exp u, – матрицы неопределенных коэффициентов • Для всех задач нелинейной регрессии входной набор данных одинаков – Размерность вектора входных данных x = 1648 • Выходные наборы данных уникальны – Размерность вектора выходных данных y = 1 Задача МТЗ. Формально. • 30000 примеров эталонной базы решений • Решение задачи нелинейной регрессии (подбор u, ) – Минимизация функционала ошибки вида EW i 1,30000yx i , W yi 2 где W = {u, } – условное обозначение матриц весов многослойного персептрона y(x, W) Например, использование метода градиентного спуска CPU. Градиентный спуск Минимизация функционала ошибки вида EW i 1,30000yx i , W yi 2 Размерность W ~ 104 Градиентный спуск: 1. W=W0 2. W=W - *grad E(W), где ~10-1–10-3 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) 8 1648 y x1 , u1 , v1 u1[i, k ] * v1[ j , i ] * x1[ j ] v1[0, i ] u1[0, k ] i 1 j 1 ………… ……… 8 1648 y xa , ub , vb ub [i, k ] * vb [ j , i ] * xa [ j ] vb [0, i ] ub [0, k ] i 1 j 1 • Аналогично с производными CUDA. Реализация • Эффект за счет резкого уменьшения числа операций работы с памятью – Необходимость переноса больших объемов данных между узлами – CUDA: наличие shared memory • Основное время при проектировании – Расположение данных в памяти • Код спроектирован с нуля • Вычисления во float-ах • Вид аппроксимационной функции Результаты N CPU / GPU Программа / железо Число сетей Итераций обучения 1 сети за минуту 1 GPU CUDA, (Tesla C2050) new 256 3120 2 GPU CUDA, (Tesla C2050) 256 2580 3 GPU CUDA, (GTX 285) 256 2580 4 GPU CUDA, (GTX 260) 256 1818 5 GPU CUDA, (Geforce 8600M GT) 64 144 6 CPU Своя нейросетевая библиотека 1 35 7 CPU Neuroshell 2 1 21 8 CPU Matlab 2008a 1 7 • 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(int N) { ... for (int i = 0; i < N; i++) ... ... } //// Этот код быстрее! template<int N> __global__ void kernel() { ... for (int i = 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) Спасибо за внимание!