Обратная задача МТЗ

advertisement
Использование нейронных сетей
для решения обратной задачи
Магнитотеллурического
Зондирования
Гужва А.Г.
Обратная задача
Магнитотеллурического Зондирования
• Обратная задача: восстановление
реальных характеристик пород по
наблюдаемым ЭМ полям
Задача Магнитотеллурического
зондирования (МТЗ)
• Обратная задача МТЗ ( -> ):
Ak = ,
ГкRNk,
RMk
• Ak – заданный дискретный оператор прямой
задачи
•  = (1… Mk) – вектор характеристик МТ
поля, измеренных на поверхности Земли
•  = (1… Nk) – вектор макропараметров
среды
• Гk – область допустимых значений 
• k – класс разрезов
Задача Магнитотеллурического
зондирования (МТЗ)
• Обратная задача МТЗ ( -> ):
Ak = ,
ГкRNk,
RMk
• Система нелинейных уравнений
относительно 
• Неустойчива и некорректна
– Вид уравнений
– Размерность данных
• Чудовищная размерность данных
Задача Магнитотеллурического
зондирования (МТЗ)
• Прямая задача МТЗ ( -> ):
Ak = ,
ГкRNk,
RMk
• Устойчива и корректна
• Считается на суперкомпьютерах
• Эталонная база решений прямой задачи:
– Задаем 1, считаем 1=Ak1, знаем (1, 1)
–…
– Задаем N, считаем N=AkN, знаем (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) = xXTst(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) = xXTrn(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, )
– Минимизация функционала ошибки вида
EW  i 1,30000yx i , W  yi 
2
где W = {u, } – условное обозначение матриц
весов многослойного персептрона y(x, W)
Например, использование метода градиентного
спуска
CPU. Градиентный спуск
Минимизация функционала ошибки вида
EW  i 1,30000yx 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)
Спасибо за внимание!
Download