15
15
"""
16
16
```julia
17
17
NonAdaptiveLoss{T}(; pde_loss_weights = 1,
18
+ energy_loss_weights = 1,
18
19
bc_loss_weights = 1,
19
20
additional_loss_weights = 1)
20
21
```
@@ -25,30 +26,33 @@ change during optimization
25
26
mutable struct NonAdaptiveLoss{T <: Real } <: AbstractAdaptiveLoss
26
27
pde_loss_weights:: Vector{T}
27
28
bc_loss_weights:: Vector{T}
29
+ energy_loss_weights:: Vector{T}
28
30
additional_loss_weights:: Vector{T}
29
31
SciMLBase. @add_kwonly function NonAdaptiveLoss {T} (; pde_loss_weights = 1 ,
32
+ energy_loss_weights = 1 ,
30
33
bc_loss_weights = 1 ,
31
34
additional_loss_weights = 1 ) where {
32
35
T < :
33
36
Real
34
37
}
35
- new (vectorify (pde_loss_weights, T), vectorify (bc_loss_weights, T),
38
+ new (vectorify (pde_loss_weights, T), vectorify (energy_loss_weights, T), vectorify ( bc_loss_weights, T),
36
39
vectorify (additional_loss_weights, T))
37
40
end
38
41
end
39
42
40
43
# default to Float64
41
- SciMLBase. @add_kwonly function NonAdaptiveLoss (; pde_loss_weights = 1 , bc_loss_weights = 1 ,
44
+ SciMLBase. @add_kwonly function NonAdaptiveLoss (; pde_loss_weights = 1 , energy_loss_weights = 1 , bc_loss_weights = 1 ,
42
45
additional_loss_weights = 1 )
43
46
NonAdaptiveLoss {Float64} (; pde_loss_weights = pde_loss_weights,
44
47
bc_loss_weights = bc_loss_weights,
48
+ energy_loss_weights = energy_loss_weights,
45
49
additional_loss_weights = additional_loss_weights)
46
50
end
47
51
48
52
function generate_adaptive_loss_function (pinnrep:: PINNRepresentation ,
49
53
adaloss:: NonAdaptiveLoss ,
50
- pde_loss_functions, bc_loss_functions)
51
- function null_nonadaptive_loss (θ, pde_losses , bc_losses)
54
+ pde_loss_functions, energy_loss_functions, bc_loss_functions)
55
+ function null_nonadaptive_loss (θ, pde_loss, energy_loss , bc_losses)
52
56
nothing
53
57
end
54
58
end
58
62
GradientScaleAdaptiveLoss(reweight_every;
59
63
weight_change_inertia = 0.9,
60
64
pde_loss_weights = 1,
65
+ energy_loss_weights = 1,
61
66
bc_loss_weights = 1,
62
67
additional_loss_weights = 1)
63
68
```
@@ -90,61 +95,66 @@ mutable struct GradientScaleAdaptiveLoss{T <: Real} <: AbstractAdaptiveLoss
90
95
reweight_every:: Int64
91
96
weight_change_inertia:: T
92
97
pde_loss_weights:: Vector{T}
98
+ energy_loss_weights:: Vector{T}
93
99
bc_loss_weights:: Vector{T}
94
100
additional_loss_weights:: Vector{T}
95
101
SciMLBase. @add_kwonly function GradientScaleAdaptiveLoss {T} (reweight_every;
96
102
weight_change_inertia = 0.9 ,
97
103
pde_loss_weights = 1 ,
104
+ energy_loss_weights = 1 ,
98
105
bc_loss_weights = 1 ,
99
106
additional_loss_weights = 1 ) where {
100
107
T < :
101
108
Real
102
109
}
103
110
new (convert (Int64, reweight_every), convert (T, weight_change_inertia),
104
- vectorify (pde_loss_weights, T), vectorify (bc_loss_weights , T),
105
- vectorify (additional_loss_weights, T))
111
+ vectorify (pde_loss_weights, T), vectorify (energy_loss_weights , T),
112
+ vectorify (bc_loss_weights, T), vectorify (additional_loss_weights, T))
106
113
end
107
114
end
108
115
# default to Float64
109
116
SciMLBase. @add_kwonly function GradientScaleAdaptiveLoss (reweight_every;
110
117
weight_change_inertia = 0.9 ,
111
118
pde_loss_weights = 1 ,
119
+ energy_loss_weights = 1 ,
112
120
bc_loss_weights = 1 ,
113
121
additional_loss_weights = 1 )
114
122
GradientScaleAdaptiveLoss {Float64} (reweight_every;
115
123
weight_change_inertia = weight_change_inertia,
116
124
pde_loss_weights = pde_loss_weights,
125
+ energy_loss_weights = energy_loss_weights,
117
126
bc_loss_weights = bc_loss_weights,
118
127
additional_loss_weights = additional_loss_weights)
119
128
end
120
129
121
130
function generate_adaptive_loss_function (pinnrep:: PINNRepresentation ,
122
131
adaloss:: GradientScaleAdaptiveLoss ,
123
- pde_loss_functions, bc_loss_functions)
132
+ pde_loss_functions, energy_loss_functions, bc_loss_functions)
124
133
weight_change_inertia = adaloss. weight_change_inertia
125
134
iteration = pinnrep. iteration
126
135
adaloss_T = eltype (adaloss. pde_loss_weights)
127
136
128
137
function run_loss_gradients_adaptive_loss (θ, pde_losses, bc_losses)
129
138
if iteration[1 ] % adaloss. reweight_every == 0
130
139
# the paper assumes a single pde loss function, so here we grab the maximum of the maximums of each pde loss function
131
- pde_grads_maxes = [maximum (abs .(Zygote. gradient (pde_loss_function, θ)[1 ]))
132
- for pde_loss_function in pde_loss_functions]
133
- pde_grads_max = maximum (pde_grads_maxes)
140
+ # we treat energy loss functions the same as pde loss functions
141
+ pde_energy_grads_maxes = [maximum (abs .(Zygote. gradient (pde_loss_function, θ)[1 ]))
142
+ for pde_loss_function in vcat (pde_loss_functions, energy_loss_functions)]
143
+ pde_energy_grads_max = maximum (pde_energy_grads_maxes)
134
144
bc_grads_mean = [mean (abs .(Zygote. gradient (bc_loss_function, θ)[1 ]))
135
145
for bc_loss_function in bc_loss_functions]
136
146
137
147
nonzero_divisor_eps = adaloss_T isa Float64 ? Float64 (1e-11 ) :
138
148
convert (adaloss_T, 1e-7 )
139
- bc_loss_weights_proposed = pde_grads_max ./
149
+ bc_loss_weights_proposed = pde_energy_grads_max ./
140
150
(bc_grads_mean .+ nonzero_divisor_eps)
141
151
adaloss. bc_loss_weights .= weight_change_inertia .*
142
152
adaloss. bc_loss_weights .+
143
153
(1 .- weight_change_inertia) .*
144
154
bc_loss_weights_proposed
145
- logscalar (pinnrep. logger, pde_grads_max , " adaptive_loss/pde_grad_max " ,
155
+ logscalar (pinnrep. logger, pde_energy_grads_max , " adaptive_loss/pde_energy_grad_max " ,
146
156
iteration[1 ])
147
- logvector (pinnrep. logger, pde_grads_maxes , " adaptive_loss/pde_grad_maxes " ,
157
+ logvector (pinnrep. logger, pde_energy_grads_maxes , " adaptive_loss/pde_energy_grad_maxes " ,
148
158
iteration[1 ])
149
159
logvector (pinnrep. logger, bc_grads_mean, " adaptive_loss/bc_grad_mean" ,
150
160
iteration[1 ])
160
170
```julia
161
171
function MiniMaxAdaptiveLoss(reweight_every;
162
172
pde_max_optimiser = Flux.ADAM(1e-4),
173
+ energy_max_optimiser = Flux.ADAM(1e-4),
163
174
bc_max_optimiser = Flux.ADAM(0.5),
164
175
pde_loss_weights = 1,
176
+ energy_loss_weights = 1,
165
177
bc_loss_weights = 1,
166
178
additional_loss_weights = 1)
167
179
```
@@ -191,65 +203,81 @@ https://arxiv.org/abs/2009.04544
191
203
"""
192
204
mutable struct MiniMaxAdaptiveLoss{T <: Real ,
193
205
PDE_OPT <: Flux.Optimise.AbstractOptimiser ,
206
+ ENERGY_OPT <: Flux.Optimise.AbstractOptimiser ,
194
207
BC_OPT <: Flux.Optimise.AbstractOptimiser } < :
195
208
AbstractAdaptiveLoss
196
209
reweight_every:: Int64
197
210
pde_max_optimiser:: PDE_OPT
211
+ energy_max_optimiser:: ENERGY_OPT
198
212
bc_max_optimiser:: BC_OPT
199
213
pde_loss_weights:: Vector{T}
214
+ energy_loss_weights:: Vector{T}
200
215
bc_loss_weights:: Vector{T}
201
216
additional_loss_weights:: Vector{T}
202
217
SciMLBase. @add_kwonly function MiniMaxAdaptiveLoss{T,
203
- PDE_OPT, BC_OPT}(reweight_every;
218
+ PDE_OPT, ENERGY_OPT, BC_OPT}(reweight_every;
204
219
pde_max_optimiser = Flux. ADAM (1e-4 ),
220
+ energy_max_optimiser = Flux. ADAM (1e-4 ),
205
221
bc_max_optimiser = Flux. ADAM (0.5 ),
206
222
pde_loss_weights = 1 ,
223
+ energy_loss_weights = 1 ,
207
224
bc_loss_weights = 1 ,
208
225
additional_loss_weights = 1 ) where {
209
226
T < :
210
227
Real,
211
228
PDE_OPT < :
212
229
Flux. Optimise. AbstractOptimiser,
230
+ ENERGY_OPT < :
231
+ Flux. Optimise. AbstractOptimiser,
213
232
BC_OPT < :
214
233
Flux. Optimise. AbstractOptimiser
215
234
}
216
- new (convert (Int64, reweight_every), convert (PDE_OPT, pde_max_optimiser),
235
+ new (convert (Int64, reweight_every), convert (PDE_OPT, pde_max_optimiser), convert (ENERGY_OPT, energy_max_optimiser),
217
236
convert (BC_OPT, bc_max_optimiser),
218
237
vectorify (pde_loss_weights, T), vectorify (bc_loss_weights, T),
219
- vectorify (additional_loss_weights, T))
238
+ vectorify (energy_loss_weights, T), vectorify ( additional_loss_weights, T))
220
239
end
221
240
end
222
241
223
242
# default to Float64, ADAM, ADAM
224
243
SciMLBase. @add_kwonly function MiniMaxAdaptiveLoss (reweight_every;
225
244
pde_max_optimiser = Flux. ADAM (1e-4 ),
245
+ energy_max_optimiser = Flux. ADAM (1e-4 ),
226
246
bc_max_optimiser = Flux. ADAM (0.5 ),
227
247
pde_loss_weights = 1 ,
248
+ energy_loss_weights = 1 ,
228
249
bc_loss_weights = 1 ,
229
250
additional_loss_weights = 1 )
230
251
MiniMaxAdaptiveLoss{Float64, typeof (pde_max_optimiser),
231
252
typeof (bc_max_optimiser)}(reweight_every;
232
253
pde_max_optimiser = pde_max_optimiser,
254
+ energy_max_optimiser = energy_max_optimiser,
233
255
bc_max_optimiser = bc_max_optimiser,
234
256
pde_loss_weights = pde_loss_weights,
257
+ energy_loss_weights = energy_loss_weights,
235
258
bc_loss_weights = bc_loss_weights,
236
259
additional_loss_weights = additional_loss_weights)
237
260
end
238
261
239
262
function generate_adaptive_loss_function (pinnrep:: PINNRepresentation ,
240
263
adaloss:: MiniMaxAdaptiveLoss ,
241
- pde_loss_functions, bc_loss_functions)
264
+ pde_loss_functions, energy_loss_functions, bc_loss_functions)
242
265
pde_max_optimiser = adaloss. pde_max_optimiser
266
+ energy_max_optimiser = adaloss. energy_max_optimiser
243
267
bc_max_optimiser = adaloss. bc_max_optimiser
244
268
iteration = pinnrep. iteration
245
269
246
- function run_minimax_adaptive_loss (θ, pde_losses, bc_losses)
270
+ function run_minimax_adaptive_loss (θ, pde_losses, energy_losses, bc_losses)
247
271
if iteration[1 ] % adaloss. reweight_every == 0
248
272
Flux. Optimise. update! (pde_max_optimiser, adaloss. pde_loss_weights,
249
273
- pde_losses)
274
+ Flux. Optimise. update! (energy_max_optimiser, adaloss. energy_loss_weights,
275
+ - energy_losses)
250
276
Flux. Optimise. update! (bc_max_optimiser, adaloss. bc_loss_weights, - bc_losses)
251
277
logvector (pinnrep. logger, adaloss. pde_loss_weights,
252
278
" adaptive_loss/pde_loss_weights" , iteration[1 ])
279
+ logvector (pinnrep. logger, adaloss. energy_loss_weights,
280
+ " adaptive_loss/energy_loss_weights" , iteration[1 ])
253
281
logvector (pinnrep. logger, adaloss. bc_loss_weights,
254
282
" adaptive_loss/bc_loss_weights" ,
255
283
iteration[1 ])
0 commit comments